我在理解应该如何处理套接字时遇到了一些问题。我知道服务器套接字必须在自己的线程中运行,因为它必须检查是否有新连接。现在,我不确定新连接打开的每个套接字是否都应该在线程中运行。
我想到的是每隔 x 次检查套接字状态。如果它有什么要读的,那就读吧。如果不是,请检查下一个套接字。我看到一些例子,这个过程是在一个线程中完成的,但我不想让套接字来做事,只想读取它是否有一些数据,然后处理它们。
我在理解应该如何处理套接字时遇到了一些问题。我知道服务器套接字必须在自己的线程中运行,因为它必须检查是否有新连接。现在,我不确定新连接打开的每个套接字是否都应该在线程中运行。
我想到的是每隔 x 次检查套接字状态。如果它有什么要读的,那就读吧。如果不是,请检查下一个套接字。我看到一些例子,这个过程是在一个线程中完成的,但我不想让套接字来做事,只想读取它是否有一些数据,然后处理它们。
答案是否定的,您不需要在单独的线程中收听。但是,请意识到,当您“聆听”时,您的整个程序将在继续之前等待它完成。
因此,除非您对整个程序的等待感到满意,否则我建议您使用单独的线程。
您还可以有一个线程以循环方式与所有套接字通信。它检查每个套接字是否有新数据,如果没有则检查下一个。
另一种选择是使用 NIO(新输入/输出)。
NIO 背后的想法是,您有一个线程,其中一个Selector拥有多个Channel(一个通道可以是网络套接字或任何其他 IO 接口)。然后在循环中调用selector.select() 。此方法阻塞,直到一个或多个通道有数据,然后返回一组这些通道。然后,您可以处理通道传递的数据。
使用 available() 循环的问题很多。
我敢肯定还有更多。
不要这样做。使用线程或 NIO。