【问题标题】:Must a listening socket runs in thread?监听套接字必须在线程中运行吗?
【发布时间】:2013-05-01 22:44:25
【问题描述】:

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

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

【问题讨论】:

  • 如果在你处理这些东西的时候又有一点东西进来,会发生什么?
  • 在不同的线程中阅读有何不同?
  • 如果你得到一个监听套接字必须在另一个线程中运行,为什么它是你的问题的标题?
  • “做事”和“阅读”有什么区别?

标签: java multithreading sockets


【解决方案1】:

答案是否定的,您不需要在单独的线程中收听。但是,请注意,当您“聆听”时,您的整个程序将等待其完成,然后再继续。

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

【讨论】:

  • 现在我使用 DataInputStream 来检查是否有一些东西要读取(input.available();),所以程序不应该等待。我说的对吗?
  • available 不应该阻塞,所以不,如果您只是循环并检查该方法,它不应该等待。但它可能会阻止读取(取决于您尝试读取的字节数)。这也是一个瓶颈,因为您有一个线程循环。在您处理一个缓冲区时,数据可能会收集在其他缓冲区中。
  • 那是怎么回事?想象一下,您有一个游戏,并且服务器处理从客户端接收的输入。但是您不希望每个连接都独立运行,而是检索输入然后处理它们(例如,如果您使用组件系统方法,则在不同的系统上执行操作)。我现在不明白为什么需要检查数据。
  • 没有错,你提到的情况可能没问题。但是例如,也许线程可以监听输入并对输入进行一些处理,然后主线程可以做更少的处理,可能做更多的工作。
  • 请使用术语。正在侦听的是 ServerSocket。套接字被读取或写入。
【解决方案2】:

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

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

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

Here is a tutorial.

【讨论】:

    【解决方案3】:

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

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

    我相信还有更多。

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

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 2011-11-14
      • 2011-02-15
      • 1970-01-01
      • 2014-02-07
      • 2014-02-10
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多