Problem with Java Sockets (in tic tac toe game)

connection, java, sockets

Solution

When one of the two users closes the program. The connection "breaks". Then the socket-class throws an IOException, that you catch:

   ...
   } catch (IOException ioException) {
            ioException.printStackTrace();
   } 
   ...

But after catching it, you do nothing. You have to add some messages and say that the the connection is broken. I think that your program doesn't crash, just stops because he catch the exeption and than close the streams in the `finnaly`.

Hope this helps.

Problem

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. 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. 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! UPDATE: I added print statements to the try-catch, however that is not stopping the problem. The error I am receiving is this: ``` Exception in thread "main" java.lang.ClassCastException: java.lang.String at Requester.run(Requester.java:32) at Requester.main(Requester.java:142) ``` I changed the code below to include all of the Tic Tac Toe logic. Requester.java:32 is ``` currentPlayer = (Integer) in.readObject(); ``` ...right after the first do-try statement. Can anyone see what is going on? The Server ``` 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(); } } ``` } The Client: ``` 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 < 3; i++) { System.out.println(""); for (int j = 0; j < 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 < 0 || row > 2) { System.out .print("Row is invalid, please choose again (0-2): "); row = scan.nextInt(); } col = scan.nextInt(); while (col < 0 || col > 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 < 0 || row > 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 < 0 || col > 2) { System.out .print("Column is invalid, please choose again (0-2): "); row = scan.nextInt(); } } for (int i = 0; i < 3; i++) { System.out.println(""); for (int j = 0; j < 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(); } ``` } ...Any help would be great, I've been stuck on this one for days. Thanks!

Original source