【问题标题】:tcp connection stuck in close_wait javatcp 连接卡在 close_wait java
【发布时间】:2014-02-07 09:39:17
【问题描述】:

有很多 close_wait 连接,当客户端客户端向服务器发送消息并出来时,TCP FSM 卡在 CLOSE_WAIT 状态

这是客户端代码,

public class Client1 
    {

        private static Socket socket;
        public static void main(String args[])
        {
            try
            {
                String host = "localhost";
                int port = 25000;
                InetAddress address = InetAddress.getByName(host);
                socket = new Socket(address, port);
                //Send the message to the server
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                String number = "2";
                String sendMessage = number + "\n";
                bw.write(sendMessage);
                bw.flush();
                System.out.println("Message sent to the server : "+sendMessage);
                //Get the return message from the server
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String message = br.readLine();
                System.out.println("Message received from the server : " +message);
            }
            catch (Exception exception) 
            {
                exception.printStackTrace();
            }
            finally
            {
                //Closing the socket
                try
                {   
                    socket.close();   
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

这是监听即将到来的连接的服务器代码

public class Server1 
{

    private static Socket socket;

    public static void main(String[] args) 
    {
        try
        {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            //Server is running always. This is done using this while(true) loop
            while(true) 
            {
                //Reading the message from the client
                socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String number = br.readLine();
                System.out.println("Message received from client is "+number);

                //Multiplying the number by 2 and forming the return message
                String returnMessage;
                try
                {
                    int numberInIntFormat = Integer.parseInt(number);
                    int returnValue = numberInIntFormat*2;
                    returnMessage = String.valueOf(returnValue) + "\n";
                }
                catch(NumberFormatException e)
                {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }

                //Sending the response back to the client.
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write(returnMessage);
                System.out.println("Message sent to the client is "+returnMessage);
                bw.flush();
            }
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e){}
        }
    }
}

输出 TCP FSM

 -bash:~$ netstat -an | grep 25000
    tcp4       0      0  127.0.0.1.25000        127.0.0.1.56459        CLOSE_WAIT 
    tcp46      0      0  *.25000                *.*                    LISTEN   

【问题讨论】:

    标签: java networking tcp tcp-ip


    【解决方案1】:

    您在错误的位置关闭了接受的套接字。它需要在接受循环内。

    【讨论】:

    • accpet 在 While 循环内,连接最终会关闭
    • 你能帮我避免这个问题吗
    • @user2554822 '它需要在接受循环中'的哪一部分你不明白?
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2015-07-18
    • 2013-04-14
    • 2014-12-04
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多