Search code examples
javaserversocketioexception

Restart ServerSocket after IOException


How to restart ServerSocket after IOException?

My server socket sometimes gets an EOFException and then stops accepting new connections. To solve this I have tried closing the old server socket and creating a new one after the exception is thrown. However even after the new server socket is created, new connections are not accepted. Can some one see why this does not work?

public Server() throws IOException {        
  try {
    listen(port);
  }
  catch (IOException e) {
    System.out.println("Server() - IO exception");
    System.out.println(e);

    /*when an exception is caught I close the server socket and try opening it a new one */
    serverSocket.close();

    listen(port);
  }
}

private void listen(int port) throws IOException {
  serverIsListening = true;

  serverSocket = new ServerSocket(port);
  System.out.println("<Listening> Port: " + serverSocket);

  while (serverIsListening) {
    if (eofExceptionThrown){  //manually triggering an exception to troubleshoot
      serverIsListening = false;
      throw new EOFException();
    }

    //accept the next incoming connection
    Socket socket = serverSocket.accept();
    System.out.println("[New Conn] " + socket);

    ObjectOutputStream oOut = new ObjectOutputStream(socket.getOutputStream());

    // Save the streams
    socketToOutputStreams.put(socket, oOut);

    // Create a new thread for this connection, and put it in the hash table
    socketToServerThread.put(socket, new ServerThread(this, socket));
  }
}

Solution

  • 2x entry point , one form catch: never ends well.

      try {
        listen(port);
      }
      catch (IOException e) {
        System.out.println("Server() - IO exception");
        System.out.println(e);
    
        /*when an exception is caught I close the server socket and try opening it a new one */
        serverSocket.close();
    
        listen(port);
      }
    

    I would do in a loop, while a boolean is true:

    while(needToListen){
      try{
         listen(port)
       }catch(Exception ex){
         if(exception   is what needed to break the loop, like a message has a string on it){
           break;
         }
       }
    }
    
      if(needToListen){
          Log.e("something unexpected, unrecoverable....");
      }