我尝试了一个我的本地ip正在ping的情况,server1_ip和server2_ip,但它导致服务器上的占用,因为在同一个ip的端口上有多个连接,如下所示。
[root@local ~]# netstat -antup -p|grep 8000
tcp 1 1 ::ffff:local_ip:58972 ::ffff:server1_ip:8000 LAST_ACK -
tcp 1 1 ::ffff:local_ip:49169 ::ffff:server2_ip:8000 LAST_ACK -
tcp 1 0 ::ffff:local_ip:49172 ::ffff:server2_ip:8000 CLOSE_WAIT 25544/java
tcp 1 0 ::ffff:local_ip:58982 ::ffff:server1_ip:8000 CLOSE_WAIT 25544/java
tcp 1 1 ::ffff:local_ip:58975 ::ffff:server1_ip:8000 LAST_ACK -
tcp 1 1 ::ffff:local_ip:49162 ::ffff:server2_ip:8000 LAST_ACK -
有2个线程,在某些功能上我需要停止线程并关闭端口8000上的套接字连接。 我正在使用以下方法,这是我的主题的一部分。
protected void disconnect() {
if (this.mSocket != null) {
try {
this.mSocket.shutdownInput();
this.mSocket.shutdownOutput();
this.mOutputStream.flush();
this.mOutputStream.close();
this.mInputStream.close();
this.mSocket.close();
} catch (Exception vException) {
vException.printStackTrace();
}
}
this.mInputStream = null;
this.mOutputStream = null;
this.mSocket = null;
}
但是当调用此方法时,它会以LAST_ACK状态发送该连接。 请让我知道这个问题的原因并解决这个问题。
答案 0 :(得分:0)
CLOSE_WAIT和LAST_ACK是在关闭之前到达的TCP连接的中间状态。 tcp连接最终应该达到CLOSED状态:CLOSE_WAIT-> LAST_ACK-> CLOSED。所以你在netstat中看到的是正常的。
请参阅此tcp连接转换状态图:http://www.cs.northwestern.edu/~agupta/cs340/project2/TCPIP_State_Transition_Diagram.pdf
代码中唯一的问题是您在关闭输出后在flush
上调用OutputStream
。您可以删除shutdownInput
& shutdownOutput
,当您想要关闭单一通信方式时,它们非常有用:输入或输出。