@Override
    protected void startGame() {
        // Client never goes first
        mainRenderFrame.showWaitDialog(opponentName);
        Thread readThread = new Thread(new Runnable() {
            @Override
            public void run() {
                String move;

                while (true) {
                    System.out.println("Posting read");
                    move = readMessage();
                    System.out.println("Read: " + move);
                    if (move == null) {
                        System.err.println("Message failed to read");
                        return;
                    }

                    if (move.equals(QUIT_KEYWORD)) {
                        return;
                    }

                    String[] splitResponse = move.split("->");
                    if (splitResponse.length != 2) {
                        System.err.println("Poorly formed communications packet");
                        continue;
                    }

                    if (splitResponse[0].equals("request")) {
                        if (game.makeMove(splitResponse[1])) {
                            // Move apply success
                            mainRenderFrame.hideWaitDialog();
                            mainRenderFrame.updateBoardDisplay(game.getGameString());
                            if (game.checkForWin()) {
                                sendMessage("win->" + game.getGameString());
                                mainRenderFrame.showLoseDialog();
                                mainRenderFrame.updateBoardDisplay(game.getGameString());
                                // Stop the read loop here since the game is over
                                break;
                            }
                            else if (game.checkForTie()) {
                                sendMessage("tie->" + game.getGameString());
                                mainRenderFrame.showTieDialog();
                                mainRenderFrame.updateBoardDisplay(game.getGameString());
                            }
                            else {
                                sendMessage("update->" + game.getGameString());
                            }
                        }
                        else { // Bad move received
                            sendMessage("update->BAD");
                        }
                    }
                    else {
                        System.err.println("Bad communications verb");
                    }
                }
            }
        });
        readThread.start();
        try {
            readThread.join();
            sendQuit();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }