我正在尝试实现一个有状态的、多客户端服务器应用程序,并对网络/线程设计有一些疑问。我目前面临的问题是如何在通信层和逻辑层之间交换消息。
服务器处理多个客户端,每个客户端可以在多个“通道”中活动,每个通道都有多个阶段,可能有多个客户端在其中操作。类比于具有多个房间的聊天程序。
我已经实现了服务器端消息的接收。每个客户端都有自己的线程,阻塞式读取数据并解码成消息。现在该怎么办?在我的观点中,每个通道也应该有自己的线程来轻松地维护其状态。我可以使用BlockingQueue来交换接收到的消息和通道线程,后者在该队列上阻塞式等待新消息。
但是如何向客户端发送消息呢?通道中的逻辑将处理消息,并产生要发送给一个/一些/所有客户端的消息。是否安全直接使用通道线程直接写入套接字?还是应该使用另一个BlockingQueue将消息传输到客户端处理程序线程?但是如何唤醒它,因为它正在套接字上等待读取?或者是否应该为每个客户端使用单独的发送线程,甚至单独的发送套接字?
顺便说一句:我知道可以使用现有的网络层库,但我想从头开始使用普通套接字实现它。