title: EOFException / SocketException when working with sockets and threads
body: <p>This socket application works perfectly fine until I add support for multiple client connections to the server. Then I get a EOFException from the client, and a SocketException: Socket closed from the server.</p>
  
  <p>Server.java:</p>
  
  <pre><code>public class Server {
  
      static final int PORT = 8005;
      static final int QUEUE = 50;
  
      public Server() {
          while (true) {
              try (ServerSocket serverSocket = new ServerSocket(PORT, QUEUE);
                   Socket socket = serverSocket.accept();
                   DataInputStream input = new DataInputStream(socket.getInputStream());
                   DataOutputStream output = new DataOutputStream(socket.getOutputStream())) {
  
                  Thread thread = new Thread(new Runnable() {
                      @Override
                      public void run() {
                          try {
                              output.writeUTF("Hey, this is the server!");
                              output.flush();
                              System.out.println(input.readUTF());
                          } catch (IOException e) {
                              System.out.println();
                              e.printStackTrace();
                          }
                      }
                  });
                  thread.start();
  
              } catch (IOException e) {
                  System.out.println(e.getMessage());
                  e.printStackTrace();
              }
          }
      }
  
      public static void main(String[] args) {
          new Server();
      }
  
  }
  </code></pre>
  
  <p>Client.java:</p>
  
  <pre><code>public class Client {
  
      static final String HOST = "localhost";
      static final int PORT = 8005;
  
      public Client() {
          try (Socket socket = new Socket(HOST, PORT);
               DataInputStream input = new DataInputStream(socket.getInputStream());
               DataOutputStream output = new DataOutputStream(socket.getOutputStream())
          ) {
              System.out.println(input.readUTF());
              output.writeUTF("Hey, this is the client!");
              output.flush();
          } catch (IOException e) {
              System.out.println(e.getMessage());
              e.printStackTrace();
          }
      }
  
      public static void main(String[] args) {
          new Client();
      }
  
  }
  </code></pre>