【发布时间】:2016-01-19 09:13:41
【问题描述】:
考虑下面的 java 伪代码(客户端使用 IP 和端口 23(telnet)打开一个到服务器的套接字:
static Socket skt = null;
skt = new Socket(IP, 23);
do something
skt.close()
ALMOST NO DELAY
skt = new Socket(IP, 23); // re-opening same socket variable (skt) right after closing it
.. 有时会发生下面的异常,因为我们正在尝试重新打开尚未完全关闭的同一个套接字 错误:java.io.IOException:连接重置
如何确保(检查)另一端的套接字已关闭?换句话说,在我们继续并在另一部分代码中重新打开该套接字之前,等待来自服务器的确认。 - 出于某种原因,我们必须重新打开同一个套接字 - 我们对在重新打开同一个套接字之前放置延迟不感兴趣。
简而言之:我们想从服务器读取确认(蓝线)
【问题讨论】:
-
要添加到@Erik 的答案,当您执行
new Socket(IP, 23)时,您每次都使用不同的本地端口打开不同的连接。您没有重复使用相同的连接。您将不得不发布更多 Wireshark 跟踪信息,以显示在您包含数据包之后会发生什么。 -
再看一遍,我看到客户端正在向服务器发送 RST。你得到的错误是出现在服务器还是客户端?
-
客户端出现错误(TCP连接的发起者)
-
@Erik,我更正了我输入错误的代码(我在正确的位置添加了保留字 static)。
-
您是否在短时间内创建了大量与服务器的连接?例如。 1 或 2 分钟内连接数千个?