title: Problem with Java Sockets (in tic tac toe game)
body: <p>I have built a two-player tic tac toe game in Java, using sockets (no threads). I have it working, except for terminating the clients when the game is over. Basically, I have it set up so that once a game is over (the server recognizes a win or a draw), then the server will send a message to the two clients. If the clients read that particular message, then they will "break out" of their do-while loops and close the socket connections.</p>
  
  <p>The problem is, whenever one client closes, the other will "crash" - it will terminate, but not successfully (it will throw an error message). Think about having three terminals open - two clients and one server. If I hit "Ctrl-C" (exit) on one client terminal, the other client will stop. The clients should be completely separate, I don't understand why this is   happening.   </p>
  
  <p>I am going to post my server code and my client code (after having removed the Tic Tac Toe logic) - can anyone see what I'm doing wrong? Thanks!</p>
  
  <hr>
  
  <p>UPDATE: I added print statements to the try-catch, however that is not stopping the problem. The error I am receiving is this:</p>
  
  <pre><code> Exception in thread "main" java.lang.ClassCastException: java.lang.String
      at Requester.run(Requester.java:32)
      at Requester.main(Requester.java:142)
  </code></pre>
  
  <p>I changed the code below to include all of the Tic Tac Toe logic. Requester.java:32 is</p>
  
  <pre><code> currentPlayer = (Integer) in.readObject();
  </code></pre>
  
  <p>...right after the first do-try statement. Can anyone see what is going on?</p>
  
  <p>The Server</p>
  
  <hr>
  
  <pre><code>    import java.io.*;
      import java.net.*;
  
  public class Provider {
  
    TBoard board = new TBoard();
  
    ServerSocket providerSocket;
    Socket connection1 = null, connection2 = null;
    ObjectOutputStream out, out2;
    ObjectInputStream in, in2;
    String message;
    Boolean done = false;
  
    int row;
    int col;
  
     Provider() {
    }
  
     void run() {
       try {
          providerSocket = new ServerSocket(20092);
  
          System.out.println("Waiting for connection...");
          connection1 = providerSocket.accept();
          System.out.println("Connection received from Player 1 "
             + connection1.getInetAddress().getHostName());
          connection2 = providerSocket.accept();
          System.out.println("Connection received from Player 2 "
             + connection2.getInetAddress().getHostName());
  
          out = new ObjectOutputStream(connection1.getOutputStream());
          out2 = new ObjectOutputStream(connection2.getOutputStream());
  
          in = new ObjectInputStream(connection1.getInputStream());
          in2 = new ObjectInputStream(connection2.getInputStream());
  
          do {
  
             if (board.get_player() == 1) {
                out.writeObject(board.get_player());
                out.flush();
                out.writeObject(board.print_board());
                out.flush();
             } 
             else {
                out2.writeObject(board.get_player());
                out2.flush();
                out2.writeObject(board.print_board());
                out2.flush();
             }
  
             sendMessage(board.get_player(),
                "Please enter a row, press Enter, then enter a column: ");
  
             if (board.get_player() == 1) {
                int[][] c_array = (int[][]) in.readObject();
                board.set_array(c_array);
             } 
             else {
                int[][] c_array = (int[][]) in2.readObject();
                board.set_array(c_array);
             }
  
             if (board.get_player() == 1) {
                board.set_player(2);
             } 
             else {
                board.set_player(1);
             }
  
             if (board.winner() != 0) {
  
  
                System.out.print("The winner is...");
  
                if (board.get_player() == 1) {
                   System.out.println("Player 2!");
                } 
                else {
                   System.out.println("Player 1!");
                }
  
                out.writeObject("bye");
                out.flush();
                out2.writeObject("bye");
                out2.flush();
  
                done = true;
  
  
             } 
             else {
  
                if(board.get_player() == 2){
                   out.writeObject("nothing");
                   out.flush();
                }
                else{
                   out2.writeObject("nothing");
                   out2.flush();
                }
  
  
             }
  
          } while (done != true);
  
       } 
           catch (IOException ioException) {
             ioException.printStackTrace();
          } 
           catch (ClassNotFoundException e) {
          // TODO Auto-generated catch block
             e.printStackTrace();
          } 
       finally {
  
          try {
  
             in.close();
             out.close();
             in2.close();
             out2.close();
             providerSocket.close();
          } 
              catch (IOException ioException) {
                ioException.printStackTrace();
             }
       }
    }
  
     void sendMessage(int player, String msg) {
       try {
          if (player == 1) {
             out.writeObject(msg);
             out.flush();
  
          } 
          else {
             out2.writeObject(msg);
             out2.flush();
          }
       } 
           catch (IOException ioException) {
             ioException.printStackTrace();
          }
    }
  
     public static void main(String args[]) {
       Provider server = new Provider();
       while (true) {
          server.run();
       }
    }
  </code></pre>
  
  <p>}</p>
  
  <p>The Client:</p>
  
  <hr>
  
  <pre><code>    import java.io.*;
      import java.net.*;
      import java.util.Scanner;
  
  public class Requester {
  
    TBoard board = new TBoard();
  
    Socket requestSocket;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    String endmessage = "";
    int row, col, currentPlayer;
  
    Scanner scan = new Scanner(System.in);
  
     Requester() {
    }
  
     void run() {
       try {
          requestSocket = new Socket("server2.xx.xxxx.xxx", 20092);
          System.out.println("Connected to localhost in port 20092");
  
          out = new ObjectOutputStream(requestSocket.getOutputStream());
          in = new ObjectInputStream(requestSocket.getInputStream());
  
          do {
             try {
  
                currentPlayer = (Integer) in.readObject();
                board.set_player(currentPlayer);
  
                int[][] b_array = (int[][]) in.readObject();
                board.set_array(b_array);
  
                for (int i = 0; i &lt; 3; i++) {
                   System.out.println("");
                   for (int j = 0; j &lt; 3; j++) {
                      if (b_array[i][j] == 1) {
                         System.out.print(" X");
                      } 
                      else if (b_array[i][j] == 2) {
                         System.out.print(" O");
                      } 
                      else {
                         System.out.print(" -");
                      }
                   }
                }
  
                System.out.println();
  
                message = (String) in.readObject();
                System.out.print(message);
  
                row = scan.nextInt();
                while (row &lt; 0 || row &gt; 2) {
                   System.out
                      .print("Row is invalid, please choose again (0-2): ");
                   row = scan.nextInt();
                }
  
                col = scan.nextInt();
                while (col &lt; 0 || col &gt; 2) {
                   System.out
                      .print("Column is invalid, please choose again (0-2): ");
                   col = scan.nextInt();
                }
  
                while (!board.make_move(row, col)) {
                   System.out
                      .print("The move is not valid. Please choose another row (0-2): ");
                   row = scan.nextInt();
  
                   while (row &lt; 0 || row &gt; 2) {
                      System.out
                         .print("Row is invalid, please choose again (0-2): ");
                      row = scan.nextInt();
                   }
  
                   System.out.print("Please choose a column (0-2): ");
                   col = scan.nextInt();
  
                   while (col &lt; 0 || col &gt; 2) {
                      System.out
                         .print("Column is invalid, please choose again (0-2): ");
                      row = scan.nextInt();
                   }
                }
  
                for (int i = 0; i &lt; 3; i++) {
                   System.out.println("");
                   for (int j = 0; j &lt; 3; j++) {
                      if (b_array[i][j] == 1) {
                         System.out.print(" X");
                      } 
                      else if (b_array[i][j] == 2) {
                         System.out.print(" O");
                      } 
                      else {
                         System.out.print(" -");
                      }
                   }
                }
  
                System.out.println();
  
                out.writeObject(board.print_board());
                out.flush();
  
                endmessage = (String) in.readObject();
  
             } 
                 catch (ClassNotFoundException classNot) {
                   System.err.println("data received in unknown format");
                }
          } while (!endmessage.equals("bye"));
       } 
           catch (UnknownHostException unknownHost) {
             System.err.println("You are trying to connect to an unknown host!");
          } 
           catch (IOException ioException) {
             ioException.printStackTrace();
          } 
       finally {
          try {
             in.close();
             out.close();
             requestSocket.close();
          } 
              catch (IOException ioException) {
                ioException.printStackTrace();
             }
       }
    }
  
     void sendMessage(int msg) {
       try {
          out.writeObject(msg);
          out.flush();
       } 
           catch (IOException ioException) {
             ioException.printStackTrace();
          }
    }
  
     public static void main(String args[]) {
       Requester client = new Requester();
       client.run();
    }
  </code></pre>
  
  <p>}</p>
  
  <p>...Any help would be great, I've been stuck on this one for days. Thanks!</p>