套接字编程的最佳做法是什么 - 我每次都要关闭它还是让它保持打开状态?

时间:2013-07-17 20:22:18

标签: java sockets

我还没有找到明确答案。

我在Java 7中有一个客户端/服务器应用程序。服务器和客户端在单独的计算机上。客户端有一个短(1行10个字符)命令发送到服务器,服务器响应(120个字符串)。这将每X秒重复一次 - 其中X是配置文件中的速率。这可能只有1秒到Integer.MAX_VALUE秒。

每次我创建客户端/服务器应用程序时,理念都是创建连接,执行业务,关闭连接,然后对数据执行任何其他操作。这似乎是应该做的事情 - 特别是在使用资源编程的尝试时。

将套接字连接挂在那里X秒会有什么打嗝?关闭并重新启动是否真的是最佳做法,或者套接字保持连接并且每隔X秒发送一次命令是一种更好的做法吗?

2 个答案:

答案 0 :(得分:3)

我认为答案取决于您期望拥有的客户数量。

如果你永远不会打开很多客户端连接,那么我会说保持连接打开并调用它,特别是如果延迟是一个问题 - 即使在LAN上,我已经看到连接需要几毫秒来初始化。但是,如果您希望有数百或数千个客户端连接并执行此操作,我会每次重新连接。正如其他人所说,打开非阻塞套接字通常意味着你有一个线程可以运行,这可能会在每个线程的基础上占用几兆字节的堆栈空间。这样做几千次,你会在大多数机器上遇到大问题。

另一个问题是端口空间。仅仅因为TCP / IP堆栈为我们提供了65535个总端口并不意味着所有端口都可用 - 实际上,大多数本地防火墙都会禁止大多数人使用,所以即使你有足够的内存来运行数千个同步线程,你也可以如果您同时打开大量连接,可能会耗尽端口。

答案 1 :(得分:0)

恕我直言,客户应该打开,做它然后关闭。

在服务器上...... 在UNIX中,通常会分配一个进程来应答呼叫(每次呼叫);但是,在Windows上,通常会为每个入站呼叫创建一个新线程。