具有多线程服务器 (TCP/IP) 的客户端/服务器聊天室

Posted

技术标签:

【中文标题】具有多线程服务器 (TCP/IP) 的客户端/服务器聊天室【英文标题】:Client/Server chatroom with multi-threaded server (TCP/IP) 【发布时间】:2013-10-22 16:13:37 【问题描述】:

我正在使用 TCP/IP 在 java 中开发一个多客户端/服务器应用程序。我的服务器为每个 clientSockets (clientSocket = serverSocket.accept();) 创建一个新线程。问题似乎在于找出一种让所有正在运行的线程相互了解的方法(即向聊天中的所有在线用户广播消息)。对于我的每个线程来说,了解新用户何时连接到服务器以及用户何时与服务器断开连接的有效方法是什么?

【问题讨论】:

您正在为每个连接启动一个线程,然后想要高效?您希望有多少用户在高峰期使用您的应用? 这确实是一门大学课程,所以我会说最多 10-15。顺便说一句,为每个连接启动一个新线程是什么效率不高? 我的帖子对您​​有帮助吗? :) 【参考方案1】:

我在你的位置会创建一个额外的队列线程,它具有对套接字线程和消息队列的引用。 您的所有套接字线程都可以将消息排入队列线程,然后将消息发送到所有套接字线程(因此套接字线程需要对您的队列线程/队列的引用 - 同步!)。

正如您所期望的那样,ArryList?套接字线程的数量可以改变你必须使用迭代器来迭代。

在 cmets 中回答您的问题:性能

为每个连接启动一个线程非常耗费资源(想象一下 10.000 个连接)。所以还有其他方法可以处理。

ThreadPoolExecutor http://mina.apache.org

我肯定会选择 mina:

Apache MINA 是一个网络应用程序框架,帮助用户轻松开发高性能和高扩展性的网络应用程序。它通过 Java NIO 在 TCP/IP 和 UDP/IP 等各种传输上提供抽象的事件驱动异步 API。

网上有很多关于 MINA 的教程。

也许有点矫枉过正,但如果你有兴趣,这是值得的。

[编辑]

如果它只有 10-15 个客户端,每个连接使用一个线程应该没问题……

【讨论】:

以上是关于具有多线程服务器 (TCP/IP) 的客户端/服务器聊天室的主要内容,如果未能解决你的问题,请参考以下文章

Socket 多线程编程

多线程 Java TCP 客户端

Python网络编程 -- TCP/IP

Linux下的TCP/IP编程----进程及多进程服务端

python---tcp/ip网络编程

Linux网络编程基础及多线程并发案例