我还没有找到一个明确的答案.
我在Java 7中有一个客户端/服务器应用程序.服务器和客户端在单独的计算机上.客户端有一个短(1行10个字符)命令发送到服务器,服务器响应(120个字符串).这将每X秒重复一次 – 其中X是配置文件中的速率.这可能短至1秒到Integer.MAX_VALUE秒.
每次我创建客户端/服务器应用程序时,理念都是创建连接,执行业务,关闭连接,然后对数据执行任何其他操作.这似乎是应该做的事情 – 特别是在使用资源编程的尝试时.
将插座连接挂在那里X秒会有什么打嗝?关闭并重新启动是否真的是最佳做法,或者套接字保持连接并且每隔X秒发送命令是一种更好的做法?
解决方法
我认为答案取决于您期望拥有的客户数量.
如果你永远不会打开很多客户端连接,那么我会说保持连接打开并调用它,特别是如果延迟是一个问题 – 即使在LAN上,我已经看到连接需要几毫秒来初始化.但是,如果您希望有数百或数千个客户端连接并执行此操作,我会每次重新连接.正如其他人所说,打开非阻塞套接字通常意味着你有一个线程可以运行,这可能会在每个线程的基础上占用几兆字节的堆栈空间.这样做几千次,你会在大多数机器上遇到大问题.
另一个问题是端口空间.仅仅因为TCP / IP堆栈为我们提供了65535个总端口并不意味着所有端口都可用 – 事实上,大多数本地防火墙都会禁止大多数人使用,所以即使你有足够的内存来运行数千个同步线程,你也可以如果您同时打开大量连接,可能会耗尽端口.