gpt4 book ai didi

Java聊天服务器

转载 作者:行者123 更新时间:2023-12-03 02:42:41 25 4
gpt4 key购买 nike

我正在编写一个基于java的聊天服务器,目前我的设计基于以下内容:-当聊天室中的一个人发送消息时,服务器端的聊天室类会循环发送相同的消息给房间中的每个参与者。显然,这是一个糟糕的设计,因为网络调用是在循环中对各个参与者进行的。因此,例如,假设聊天室中有 10 个人。当一个用户发送一条消息时,聊天室类将循环发送相同的消息给所有 10 个人。如果可以说,循环中的第五个人的连接很差,那么第六..第十个人看到该消息的时间就会受到影响。

如果我从每个房间的单播转移到多播,那么如何获取每个聊天室的私有(private)多播组 IP?此外,每个聊天室都有单独的组似乎有些过分了。主要问题之一是,当我通过循环回复房间中的用户时,通过套接字连接发送数据的方法被阻塞。因此,我在想如果我使用非阻塞 NIO 套接字,然后循环发送消息给收件人,是否可以解决问题?是否还有其他巧妙的技巧可以优化向房间内的收件人发送数据?

最佳答案

简单的实现是每个客户端使用两个线程。一个线程从套接字读取数据,另一个线程向套接字写入数据。如果你的客户很少,那就没问题了。您必须了解蔚来才能处理许多客户。 (“很多”意味着线程模型不能很好地工作。)

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

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

Apache Mina有一个使用 NIO 的示例

关于Java聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1151652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com