Note that there are some explanatory texts on larger screens.

plurals
  1. POProblem with Java Sockets (in tic tac toe game)
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload