我正在编写一个基于Java的聊天服务器,目前我的设计基于以下内容:
当聊天室中的某个人发送消息时,服务器端的聊天室类将相同的消息循环发送给会议室中的每个参与者。显然,这是一个糟糕的设计,因为正在循环中向各个参与者进行网络呼叫。因此,例如,考虑一个聊天室中有10个人。当一个用户发送一条消息时,聊天室类将循环向所有10个人发送同一条消息。如果让我们说,循环中的第5个人的关系很糟糕,那么第六.. 10个人看到该消息的时间将受到影响。

如果我从每个房间的单播切换到多播,那么如何在每个聊天室获取一个私有多播组ip?同样,每个聊天室单独分组似乎太过分了。
主要问题之一是,当我通过循环回复房间中的用户时,通过套接字连接发送数据的方法被阻止。因此,我在考虑是否使用非阻塞NIO套接字,然后将消息循环发送给收件人,是否可以解决问题?
还有其他巧妙的技巧可以用来优化向会议室中的收件人发送数据的方式吗?

最佳答案

简单的实现是每个客户端使用两个线程。一个线程从套接字读取,另一个线程写入套接字。如果您的客户很少,那很好。您将必须了解NIO才能处理许多客户。 (“很多”的意思是当线程模型无法正常工作时。)

客户端的读取线程从套接字读取整个消息,并将其放在ChatRoom对象的队列中。聊天室有一个线程,该线程将消息从队列中取出,并将其放入客户端的队列中。客户端编写线程轮询其队列,并将消息写入套接字。

ChatRoom具有一个线程来接受连接并创建客户端对象,并将其放入集合中。它具有另一个线程来轮询其消息队列并将消息分发到客户端队列。

Apache Mina有一个使用NIO的示例

07-24 09:37
查看更多