5

我还没有找到一个明确的答案。

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

每次我创建客户端/服务器应用程序时,其理念都是创建连接、执行业务、关闭连接,然后对数据执行任何其他操作。这似乎是事情应该做的方式——尤其是在将 try 与资源编程一起使用时。

将套接字连接挂在那里 X 秒有什么问题?关闭并重新启动真的是最佳做法,还是让套接字保持连接并每 X 秒发送一次命令是更好的做法?

4

2 回答 2

3

我认为答案在一定程度上取决于您期望拥有的客户数量。

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

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

于 2013-07-17T20:28:37.833 回答
0

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

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

于 2013-07-17T20:26:24.113 回答