如何绕过超时时间立即关闭套接字?

时间:2010-02-02 21:35:48

标签: java sockets timeout

在Java中,关闭套接字时,它不再执行任何操作,但实际上会在超时后关闭TCP连接。

我需要使用数千个套接字,我希望它们在关闭后立即关闭,而不是在超时期限之后关闭,这会浪费我的时间和资源。我该怎么办?

4 个答案:

答案 0 :(得分:6)

我发现通过使用socket.setReuseAddress(boolean),您可以告诉JVM重用该端口,即使它处于超时期限内。

答案 1 :(得分:4)

你可能看到TIME_WAIT状态的套接字。这是套接字进入“主动关闭”连接一侧的正常状态。 TIME_WAIT存在的原因非常充分,因此您应该小心重复使用地址。

我写了关于TIME_WAIT的文章,为什么它存在以及在我的博客上写这些服务器时你能做些什么:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

总之,如果可以,请更改协议,以便客户输入TIME_WAIT

答案 2 :(得分:3)

如果您正在运行服务器,那么ServerSocket是正确的解决方案。它将通过回收以及用于运行带有Java的服务器的许多其他优化来手动管理所有内容。

关闭套接字会断开Java对象与操作系统的连接,这意味着它不会占用JVM之外的任何资源,因此它确实应该不是问题。但是,如果Java的垃圾收集/完成方案中的 minimal 开销太大,那么Java就不是一个有效的解决方案(因为您的问题不再是特定于套接字编程的)。虽然我不得不说高效的垃圾收集器并不比明确管理内存差(并且实际上可以更好地执行)。

答案 3 :(得分:1)

'我希望他们在浪费我的时间和资源之后关闭它们之后完全关闭!' 不,你没有。您希望TCP / IP正常工作,TIME_WAIT状态是其中一个至关重要的部分。如果您担心TIME_WAIT状态,那么快速回答是接收 FIN的人,而不是首先发送的人。