【发布时间】:2011-06-19 20:34:48
【问题描述】:
我需要定期与 plc 通信(每 1 秒),我发送消息并接收消息。我使用Socket 类进行此通信。我需要每 1 秒打开连接(socket=new Socket(ipaddress, port)),然后发送消息socket.close() 等等,还是一直保持套接字 opet?
【问题讨论】:
我需要定期与 plc 通信(每 1 秒),我发送消息并接收消息。我使用Socket 类进行此通信。我需要每 1 秒打开连接(socket=new Socket(ipaddress, port)),然后发送消息socket.close() 等等,还是一直保持套接字 opet?
【问题讨论】:
我假设您在这里谈论的是 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 个套接字...
【讨论】:
保持套接字始终连接将减少客户端的网络流量和计算时间。但是,如果服务器使用阻塞 I/O,如果许多客户端保持连接,它可能会耗尽连接线程。您还必须处理由于超时、网络问题和服务器停机而导致的连接中断。
【讨论】:
您可以拥有永久连接的客户端,其中客户端始终连接到服务器。但是这种方法的性能取决于服务器是如何实现的。如果它使用线程模型(每个客户端连接一个线程),您可能会在处理大量客户端连接时发现自己的资源不足。如果您的服务器使用基于事件的方法来处理请求,只要“计算”的寿命不长,那么您应该使用永久客户端方法。
与往常一样,根据您的用例进行基准测试,您应该一切顺利。
【讨论】: