【发布时间】:2019-12-03 11:05:06
【问题描述】:
我使用 java.nio 进行服务器编程,它工作正常。 当我尝试关闭套接字时:
serverChannel.socket().close();
serverChannel.close();
boolean b1 = serverChannel.socket().isBound();
boolean b2 =
serverChannel.socket().isClosed();
并检查值,b1 为真,b2 为真。 当我运行 netstat 时,我看到状态 od 端口是“LISTENNING” 当我使用“旧” IO 时,关闭套接字完全符合我的预期(netstat 没有将端口列为监听)。
如何在不关闭 JVM 的情况下“解除绑定”套接字?
【问题讨论】:
-
isBound()仅表示您直接或间接致电bind()。它永远不会再变成假的。这并不意味着底层端口仍在使用中。除非你用Selector来解决这里没有问题,在这种情况下关闭直到下一次选择操作才会生效。你可以用selectNow()强制它。 -
NB 你不需要两个都关闭。任何一个都足够了。
-
@user207421 "这里没有问题可以解决,除非您将它与选择器一起使用,在这种情况下,关闭直到下一次选择操作才会生效。您可以使用 selectNow( )" 我正在使用选择器,但我无法获得它。你有任何链接或参考。
-
对我来说似乎非常清楚。请参阅 Javadoc。
标签: java socketchannel