sockets在1秒内打开和关闭或保持打开状态

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

我假设你在这里谈论TCP套接字……

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

我在博客上写过关于TIME_WAIT及其导致服务器可扩展性和稳定性的问题: http : //www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications -适用的协议和可扩展-servers.html

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

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

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

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

一如既往,基于您的用例的基准,你应该很高兴。