1

我在理解应该如何处理套接字时遇到了一些问题。我知道服务器套接字必须在自己的线程中运行,因为它必须检查是否有新连接。现在,我不确定新连接打开的每个套接字是否都应该在线程中运行。

我想到的是每隔 x 次检查套接字状态。如果它有什么要读的,那就读吧。如果不是,请检查下一个套接字。我看到一些例子,这个过程是在一个线程中完成的,但我不想让套接字来做事,只想读取它是否有一些数据,然后处理它们。

4

3 回答 3

2

答案是否定的,您不需要在单独的线程中收听。但是,请意识到,当您“聆听”时,您的整个程序将在继续之前等待它完成。

因此,除非您对整个程序的等待感到满意,否则我建议您使用单独的线程。

于 2013-05-01T22:55:09.727 回答
2

您还可以有一个线程以循环方式与所有套接字通信。它检查每个套接字是否有新数据,如果没有则检查下一个。

另一种选择是使用 NIO(新输入/输出)。

NIO 背后的想法是,您有一个线程,其中一个Selector拥有多个Channel(一个通道可以是网络套接字或任何其他 IO 接口)。然后在循环中调用selector.select() 。此方法阻塞,直到一个或多个通道有数据,然后返回一组这些通道。然后,您可以处理通道传递的数据。

这是一个教程

于 2013-05-01T23:03:44.830 回答
1

使用 available() 循环的问题很多。

  1. 它假设 available() 确实有效,但不能保证。
  2. 它假定所有客户端都需要相同数量的服务。
  3. N-1 个客户端在为一个客户端提供服务时等待。
  4. 无响应的客户端不仅可以阻止您的应用程序,还可以阻止所有其他客户端。

我敢肯定还有更多。

不要这样做。使用线程或 NIO。

于 2013-05-01T23:27:32.540 回答