我试图实现一个状态,多客户端服务器应用程序,有关于网络/线程设计的一些问题。我目前面临的问题是如何在通信层和逻辑层之间交换消息。的Java多线程状态服务器 - 网络设计
的服务器处理多个客户端,其中,它们中的每可以在多个“通道”,其中每个信道具有多个阶段具有活性,并且可以具有在其作用多个客户端。把它想象成一个类似于多个房间的聊天程序。
我已经执行消息的接收在服务器端。每个客户端都有自己的线程,可以阻止读取数据并将其解码为消息。现在如何继续?在我看来,每个渠道都应该有自己的线程来轻松维护自己的状态。我可以使用BlockingQueue将收到的消息与频道线程交换,该线程正在阻塞地等待该队列中的新消息。
但是如何发送消息给客户端?通道中的逻辑将处理消息,并产生一些消息发送给一个/某些/所有客户端。使用通道线程直接写入套接字是否安全?或者我应该使用另一个BlockingQueue将消息传输到客户端处理程序线程?但是,如何唤醒它,因为它在插座上等待读取?或者我应该为每个客户端使用单独的发送线程,或者甚至使用单独的发送套接字?
BTW:我知道我可以使用现有的库用于网络层,但我想你从头开始做在普通插座。
我不确定如果处理是便宜和每条消息,我会根据多线程进行操作。我会考虑使用反应堆。每个客户端和/或通道都有状态这一事实并不意味着您必须使用线程。 – sinelaw 2011-02-01 13:27:36
@sinelaw我假设你指的是NIO。我阅读这篇文章http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html比较NIO/IO,所以我选择使用每个连接一个线程(并已实施)。但对于渠道,可以选择另一种方法...但实际问题将是相同的 – 2011-02-01 13:50:34