侦听套接字必须在线程中运行吗?

时间:2013-05-01 22:44:25

标签: java multithreading sockets

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

我想到的是检查套接字所说的每x次。如果有东西需要阅读,那么请阅读。如果没有,请检查下一个插座。我看到一些例子,这个过程是在一个线程中完成的,但是我不想让套接字做东西,只是想要读取它是否有一些数据,并处理它们。

3 个答案:

答案 0 :(得分:2)

答案是否定的,你不需要在一个单独的线程中听。但是,只要意识到,当你“倾听”时,你的整个程序将等待它继续前进。

因此,除非你对整个程序等待好,否则我会建议一个单独的线程。

答案 1 :(得分:1)

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

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

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

Here is a tutorial

答案 2 :(得分:1)

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

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

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