gpt4 book ai didi

java - ServerSocketChannel 已关闭,但 TCP ESTABLISHED 仍在

转载 作者:行者123 更新时间:2023-12-01 10:02:38 28 4
gpt4 key购买 nike

我有一个 ServerSocketChannel 和一个 Socket.ServerSocket 绑定(bind)在端口 8888 上。Socket连接到ServerSocket并发送数据。如果我只关闭ServerSocket,TCP仍然是ESTABLISHED。如果我只关闭Socket,则没有任何ESTABLISHED。

我使用以下代码来关闭 ServerSocketChannel:

public void doStop() {
try {
acceptChannel.close(); //close ServerSocketChannel
acceptChannel.socket().close(); //close ServerSocket
LOG.debug("close server socket. " + acceptChannel.socket().isClosed());
} catch (IOException ignore) {}
try { selector.close(); } catch (IOException ignore) {}
}

这里有两种TCP状态。

1.在我关闭ServerSocket之前:

zephyrdeiMac:~ zephyrguo$ lsof -i tcp:8888 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 26272 zephyrguo 17u IPv4 0x5f7a02f802ab0c75 0t0 TCP *:ddi-tcp-1 (LISTEN)
java 26272 zephyrguo 40u IPv4 0x5f7a02f802b07715 0t0 TCP 127.0.0.1:52728->127.0.0.1:ddi-tcp-1 (ESTABLISHED)
java 26272 zephyrguo 41u IPv4 0x5f7a02f7f9669ff5 0t0 TCP 127.0.0.1:ddi-tcp-1->127.0.0.1:52728 (ESTABLISHED)

2.关闭ServerSocket后:

zephyrdeiMac:~ zephyrguo$ lsof -i tcp:8888 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 26272 zephyrguo 40u IPv4 0x5f7a02f802b07715 0t0 TCP 127.0.0.1:52728->127.0.0.1:ddi-tcp-1 (ESTABLISHED)
java 26272 zephyrguo 41u IPv4 0x5f7a02f7f9669ff5 0t0 TCP 127.0.0.1:ddi-tcp-1->127.0.0.1:52728 (ESTABLISHED)

这里还显示ESTABLISHED,但是没有LISTEN.Socket可以发送数据,但是没有响应。

最佳答案

  1. 关闭ServerSocketChannel不会以任何方式影响已建立的连接。您的期望不正确。

  2. A ServerSocketChannelSocketChannel注册号为 Selector close() 之后保持开放直到您下次调用 select() 。您可以调用selectNow()强制这样做。这是在 Javadoc 中的某处记录的,当我查找它时我永远找不到它。他们用 dup() 做了一些把戏以确保您无法使用 SocketChannel除了 Selector 之外的任何其他不会损坏。

关于java - ServerSocketChannel 已关闭,但 TCP ESTABLISHED 仍在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com