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

时间:2011-02-02 09:41:16

标签: java sockets

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

3 个答案:

答案 0 :(得分:8)

我假设你在这里谈论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期间TIME_WAIT内有240(60 * 4)个套接字)假设TIME_WAIT套接字最终在客户端上而不是在服务器上并且假设您没有每秒连接到大量服务器,但是......如果您有很多服务器,则不应该证明太多问题客户端每秒连接到您的服务器并且您没有确保您的服务器不会在TIME_WAIT状态下累积套接字,那么您可能会限制服务器的可伸缩性。

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

中持有240个插座

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

与往常一样,基于您的用例的基准测试,你应该很高兴。