Search code examples
javaperformancetcpjava-server

Reproduce tcp CLOSE_WAIT state with java client/server


Is there an easy way to reproduce the tcp CLOSE_WAIT state with a java program?

I have a legacy java application that have this problem and I'd like to be able to reproduce it so that i can test my fix.

Thanks


Solution

  • A connection is in the CLOSE_WAIT state when the other side has closed the connection but this side hasn't. It is easy to reproduce:

    // Client.java (will sleep in CLOSE_WAIT)
    import java.io.*;
    import java.net.*;
    
    public class Client
    {
        public static void main(String[] args) throws Exception
        {
            Socket socket = new Socket(InetAddress.getByName("localhost"), 12345);
            InputStream in = socket.getInputStream();
            int c;
            while ((c = in.read()) != -1)
            {
                System.out.write(c);
            }
            System.out.flush();
    
            // should now be in CLOSE_WAIT
            Thread.sleep(Integer.MAX_VALUE);
        }
    }
    
    // Server.java (sends some data and exits)
    import java.io.*;
    import java.net.*;
    
    public class Server
    {
        public static void main(String[] args) throws Exception
        {
            Socket socket = new ServerSocket(12345).accept();
            OutputStream out = socket.getOutputStream();
            out.write("Hello World\n".getBytes());
            out.flush();
            out.close();
        }
    }