【问题标题】:Socket open and close on 1 sec or to hold open套接字打开和关闭 1 秒或保持打开状态
【发布时间】:2011-06-19 20:34:48
【问题描述】:

我需要定期与 plc 通信(每 1 秒),我发送消息并接收消息。我使用Socket 类进行此通信。我需要每 1 秒打开连接(socket=new Socket(ipaddress, port)),然后发送消息socket.close() 等等,还是一直保持套接字 opet?

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    我假设您在这里谈论的是 TCP 套接字...

    除了每秒建立 TCP 连接所涉及的明显低效率之外,您还可能最终在 TIME_WAIT 中累积套接字(希望在您的客户端上)。

    我在我的博客上写过TIME_WAIT 以及它导致的有关服务器可扩展性和稳定性的问题:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

    鉴于您打开和关闭套接字的速率(在正常(4 分钟)2MSL TIME_WAIT 期间,每秒一次将导致 240 (60*4) 个套接字位于 TIME_WAIT 中)这不应该证明假设TIME_WAIT 套接字最终在客户端而不是在服务器上,并且假设您没有每秒连接到很多服务器,但是......如果您有很多客户端连接到您的服务器,那么问题就太大了其次,如果您不确定您的服务器不会在TIME_WAIT 状态下累积套接字,那么您可能会限制服务器的可扩展性。

    另一种方法是保持套接字连接打开,只有在它被中断时才重新打开它。对于您最初的编程来说,这可能会稍微复杂一些,但是以这种方式汇集连接可能会更加有效(当您确实需要发送数据时,您只需发送数据而不需要通过 TCP 握手建立连接)和客户端上的资源效率更高;你不会永远在TIME_WAIT 中持有 240 个套接字...

    【讨论】:

      【解决方案2】:

      保持套接字始终连接将减少客户端的网络流量和计算时间。但是,如果服务器使用阻塞 I/O,如果许多客户端保持连接,它可能会耗尽连接线程。您还必须处理由于超时、网络问题和服务器停机而导致的连接中断。

      【讨论】:

        【解决方案3】:

        您可以拥有永久连接的客户端,其中客户端始终连接到服务器。但是这种方法的性能取决于服务器是如何实现的。如果它使用线程模型(每个客户端连接一个线程),您可能会在处理大量客户端连接时发现自己的资源不足。如果您的服务器使用基于事件的方法来处理请求,只要“计算”的寿命不长,那么您应该使用永久客户端方法。

        与往常一样,根据您的用例进行基准测试,您应该一切顺利。

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 2011-05-25
          • 1970-01-01
          • 2012-11-23
          • 1970-01-01
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多