netstat在关闭套接字后显示last_ack

时间:2014-04-30 09:29:10

标签: java multithreading sockets netstat

我尝试了一个我的本地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状态发送该连接。 请让我知道这个问题的原因并解决这个问题。

1 个答案:

答案 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,当您想要关闭单一通信方式时,它们非常有用:输入或输出。