我想在java中编写一个可以同时处理许多用户的聊天应用程序。我读了关于套接字和线程池以限制线程数,但我无法想象如何处理例如同时进行100个套接字连接,不创建100个新线程。想法是客户端在开始时连接,并且他的连接保持打开状态,直到他离开聊天。他可以将数据发送到服务器以及接收其他用户的消息。
从套接字读取是阻塞操作,所以如果特定套接字连接有新数据可用,我需要在循环中检查所有用户的套接字是否超时?我的第一个想法是创建例如3个线程用于处理来自所有连接用户的输入,3个线程用于从服务器到客户端的远程通信,但我怎样才能实现这一点?是否有Java中的套接字异步API,我可以在哪里定义用于进/出通信的线程池?
答案 0 :(得分:1)
制作展开Client
的Thread
课程。编写所有方法,并在void run()
方法中,编写在客户端连接时要执行的代码。
在Server
侧,侦听新连接。接受新连接,获取有关连接的信息,将其在构造函数中传递给创建新的Client
对象,然后将其添加到ArrayList
以跟踪所有正在进行的连接并执行start()
方法。因此,所有Client
个对象都在Arraylist
中,并且它们会同时运行。
一年前我做过这样的聊天应用程序。一旦客户端脱离,请不要忘记关闭连接,使所有对象堆积起来并减慢应用程序的速度。我学到了很难的方法。
答案 1 :(得分:1)
使用Netty,因为它提供了一个NIO框架(非阻塞IO),因此每个连接不需要1个线程。使用非阻塞IO编写服务器有点(或很多......)更复杂,但是每个连接不需要一个线程就可以获得性能提升。
但是,100个线程并不多,所以您仍然可以使用标准IO和每个连接一个线程创建服务器,这只取决于您需要扩展多少。
对于使用Netty的服务器设置,您可以创建一个分配了新连接的通道。此通道是一系列有序的处理程序,用于处理来自连接/客户端的传入(和传出)消息。处理程序本身都需要是异步的,这样当处理程序需要将消息返回给客户端时,它会异步(非阻塞地)将其写入通道并接收将来可以附加操作的后续消息写入。
有一点学习曲线,但它不是那么陡峭,如果构建Netty方式与使用标准阻塞IO,应用程序的整体设计会好得多。