Search code examples
javamultithreadingsocketsrunnableserversocket

Closed socket issue


Trying to write a simple server that echoes back text, need to give it multiple threads. I'm getting a Socket closed whenever a client connects. I'm not quite sure whats wrong, and I have only just started learning this so I'm not knowledgeable. If anyone can tell me whats wrong I'd appreciate it. Note: This code is obviously not entirely done I mostly just need with the aforementioned issue.

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import java.io.OutputStream;
import java.io.PrintStream;

import java.net.ServerSocket;
import java.net.Socket;

import java.io.IOException;

public final class EchoServer 
{
    public static void main(String[] args) throws Exception 
    {
        try (ServerSocket serverSocket = new ServerSocket(22222)) 
        {
            while (true) 
            {
                try (Socket socket = serverSocket.accept()) 
                {
                    Thread newThread = new Thread(new server(socket));
                    newThread.start();
                }
            }
        }
    }
}
class server implements Runnable
{   
    Socket mySocket; 
    server(Socket s)
    {
        mySocket = s;
    }

    public void run()
    {
        //while(true)
        //{
            try
            {
                System.out.println("Client connected ");

                InputStream is = mySocket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                BufferedReader br = new BufferedReader(isr);

                OutputStream os = mySocket.getOutputStream();
                PrintStream out = new PrintStream(os);

                String input = ("...");

                while(!input.equals("exit"))
                {   
                    input = br.readLine();
                    out.println("Server> " + input);
                }
            }
            catch(IOException e)
            {
                System.out.println(e);
            }
        //}
    }
}

Solution

  • Try-with-resources blocks close the resource immediately when they exit, so

    try (Socket socket = serverSocket.accept()) 
    {
      Thread newThread = new Thread(new server(socket));
      newThread.start();
    }
    // socket is closed by here, but newThread may still be running.
    

    So, just remove the try:

    Socket socket = serverSocket.accept();
    Thread newThread = new Thread(new server(socket));
    newThread.start();
    // socket is still open here.
    

    but remember to close the socket in your server class (eventually).