Java 同时处理多个常量套接字连接

Java 同时处理多个常量套接字连接,java,multithreading,sockets,asynchronous,Java,Multithreading,Sockets,Asynchronous,我想用java编写一个聊天应用程序,它可以同时处理多个用户。我读过关于限制线程数量的套接字和线程池的文章,但我无法想象如何同时处理100个套接字连接,而不创建100个新线程。这个想法是,客户端在开始连接时,他的连接保持打开状态,直到他离开聊天室。他可以向服务器发送数据,也可以接收其他用户的消息 从套接字读取是阻塞操作,所以如果在特定的套接字连接中有新数据可用,我需要检查循环中的所有用户套接字并超时?我的第一个想法是创建3个线程,用于处理所有连接用户的输入,3个线程用于将通信从服务器发送到客户端,

我想用java编写一个聊天应用程序,它可以同时处理多个用户。我读过关于限制线程数量的套接字和线程池的文章,但我无法想象如何同时处理100个套接字连接,而不创建100个新线程。这个想法是,客户端在开始连接时,他的连接保持打开状态,直到他离开聊天室。他可以向服务器发送数据,也可以接收其他用户的消息


从套接字读取是阻塞操作,所以如果在特定的套接字连接中有新数据可用,我需要检查循环中的所有用户套接字并超时?我的第一个想法是创建3个线程,用于处理所有连接用户的输入,3个线程用于将通信从服务器发送到客户端,但我如何实现这一点?Java中是否有用于套接字的异步API,我可以在其中定义线程池以进行输入/输出通信?

创建一个扩展
线程的
客户机
类。编写所有方法,并在
void run()
方法中,编写您希望在建立客户端连接时执行的代码

服务器
端,监听新连接。接受一个新连接,获取有关该连接的信息,将其传递到构造函数中,以创建一个新的
客户机
对象,并将其添加到
阵列列表
以跟踪所有正在进行的连接并执行
start()
方法。因此,所有
客户机
对象都位于
阵列列表
中,并且它们同时保持运行

大约一年前,我做了一个这样的聊天应用程序。当客户端断开连接时,不要忘记关闭连接,否则所有对象都会堆积起来,应用程序会变慢。我了解到这是一个艰难的过程。

使用它,因为它提供了一个NIO框架(非阻塞IO),所以每个连接不需要1个线程。使用非阻塞IO编写服务器要稍微复杂一点(或复杂得多),但不需要每个连接都有一个线程,这会提高性能

然而,100个线程并不多,所以您仍然可以使用标准IO和每个连接一个线程来创建服务器,这取决于您需要扩展多少

对于使用Netty的服务器设置,您可以创建一个分配新连接的通道。此通道是一系列有序的处理程序,用于处理来自连接/客户端的传入(和传出)消息。处理程序本身都需要是异步的,这样,当处理程序需要将消息返回给客户端时,它会将消息异步(非阻塞)写入通道,并接收一个将来返回的消息,以便在消息实际写入时附加操作


有一点学习曲线,但它没有那么陡峭,如果以Netty方式构建应用程序,与使用标准阻塞IO相比,应用程序的总体设计会更好。

如果您不需要重新发明轮子,我建议你看一下哪些抽象了很多,每个客户端使用一个线程是一种反模式。是的,它对10个、20个或100个客户机都非常有效,但随着客户机数量的增加,它会显著降低。非阻塞I/O(通过使用Netty、另一个库或直接使用JavaNIO)将为您提供更好的长期性能。但是,我不认为他会建立一个有很多客户的商业应用程序。这是一个简单的解决方案,可以让他开始。只要每次使用后正确关闭每个连接,它就会正常工作。根据我的使用情况,它可以正常工作,有53个连接。当我在大学的课堂上进行实验时,我仍然想知道一个更好的方法。我会去看看那些图书馆。但是,完全靠自己从零开始构建一些东西是很好的,值得的。:)每个客户端创建一个线程是一种不好的做法,我在问题中写到了这一点,所以你的答案毫无意义。