Java netstat显示关闭套接字后的最后一次确认

Java netstat显示关闭套接字后的最后一次确认,java,multithreading,sockets,netstat,Java,Multithreading,Sockets,Netstat,我正在尝试一个场景,其中我的本地ip正在ping,server1_ip和server2_ip,但这会造成服务器占用,因为同一ip的端口上有1个以上的连接,如下所示 [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 ::

我正在尝试一个场景,其中我的本地ip正在ping,server1_ip和server2_ip,但这会造成服务器占用,因为同一ip的端口上有1个以上的连接,如下所示

[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;    
}
但是,当调用此方法时,它将以最后确认状态发送该连接。
请告诉我此问题的原因和解决方法。

关闭\u等待和最后一次确认是在关闭前到达的TCP连接的中间状态。tcp连接最终应达到关闭状态:CLOSE\u WAIT->LAST\u ACK->CLOSED。所以在netstat中看到的是正常的

请参见此tcp连接转换状态图:

代码中唯一的问题是在关闭输出后,在
OutputStream
上调用
flush
。您可以删除
shutdownInput
shutdownOutput
,它们在您想要关闭单一通信方式时非常有用:输入或输出