2011-02-01 57 views
4

我试图实现一个状态,多客户端服务器应用程序,有关于网络/线程设计的一些问题。我目前面临的问题是如何在通信层和逻辑层之间交换消息。的Java多线程状态服务器 - 网络设计

的服务器处理多个客户端,其中,它们中的每可以在多个“通道”,其中每个信道具有多个阶段具有活性,并且可以具有在其作用多个客户端。把它想象成一个类似于多个房间的聊天程序。

我已经执行消息的接收在服务器端。每个客户端都有自己的线程,可以阻止读取数据并将其解码为消息。现在如何继续?在我看来,每个渠道都应该有自己的线程来轻松维护自己的状态。我可以使用BlockingQueue将收到的消息与频道线程交换,该线程正在阻塞地等待该队列中的新消息。

但是如何发送消息给客户端?通道中的逻辑将处理消息,并产生一些消息发送给一个/某些/所有客户端。使用通道线程直接写入套接字是否安全?或者我应该使用另一个BlockingQueue将消息传输到客户端处理程序线程?但是,如何唤醒它,因为它在插座上等待读取?或者我应该为每个客户端使用单独的发送线程,或者甚至使用单独的发送套接字?

BTW:我知道我可以使用现有的库用于网络层,但我想你从头开始做在普通插座。

+0

我不确定如果处理是便宜和每条消息,我会根据多线程进行操作。我会考虑使用反应堆。每个客户端和/或通道都有状态这一事实并不意味着您必须使用线程。 – sinelaw 2011-02-01 13:27:36

+0

@sinelaw我假设你指的是NIO。我阅读这篇文章http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html比较NIO/IO,所以我选择使用每个连接一个线程(并已实施)。但对于渠道,可以选择另一种方法...但实际问题将是相同的 – 2011-02-01 13:50:34

回答

1

在包装套接字的通信对象上放置发送消息方法。同步此方法,以便只有一个线程可以一次调用它。然后,多少个线程调用这个方法并没有什么不同。每条消息一次只能发送一条消息。你也不必打扰阻塞阅读的线程。这个发送方法将是一个足够快的操作,您不必担心线程发送时其他线程阻塞。

只要信道具有针对每个连接的客户端通信对象的引用,它可以发送消息,而不必担心它。

如果它曾经引起的问题,你总是可以修改发送消息给排队的对象发送。然后你可以有一个特定的发送线程来阻塞队列并将内容写入套接字。但从我的经验来看,这不是必要的。

-1

事件机制怎么样?当您准备好处理请求并且有可用客户端的数据时,只需使用客户端套接字处理程序线程的事件发送它即可。因为来自客户端的传输已结束,您可以正常发送答复 - 如果我认为正确。