Java проблемы с сокетами и потоками - PullRequest
0 голосов
/ 25 мая 2020
• 1000 В настоящее время я написал таймер, чтобы клиент мог отправлять сообщение на сервер каждые 5 секунд, сервер прочитает это сообщение и отправит одно обратно клиенту, чтобы подтвердить, что они все еще подключены.

Однако, другое сообщение, которое может быть отправлено на сервер, - это запрос на добавление символа на игровое поле. Иногда этот запрос не регистрируется, когда он отправляется, пока установлена ​​система «сердцебиения».

Это то, что вызывается, чтобы инициировать мою систему сердцебиения, клиент запускает этот поток и записывает сообщение на сервер .

public void startHeartBeat() {
        String heartBeat = "isAlive";
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    outputStream.write(heartBeat.getBytes());
                    System.out.println("Heartbeat sent to server.");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 5000);
    }

Это то, что вызывается, когда клиент запрашивает символ с сервера (запускается щелчком по плитке).

public void requestSymbol(int x, int y) throws IOException {
        String symbolCmd;
        if (symbol.toString().equalsIgnoreCase("x"))
            symbolCmd = "addcross";
        else
            symbolCmd = "addnaught";
        String cmd = symbolCmd + " " + x + " " + y + "\n";
        System.out.println(cmd);
        outputStream.write(cmd.getBytes());
    }

Затем мой сервер запускает этот блок кода на поток для чтения сообщений от клиента.

private void handleClientSocket() throws IOException {
        InputStream inputStream = clientSocket.getInputStream();
        this.sendStream = clientSocket.getOutputStream();
        assignCmds();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            String[] tokens = line.split(" ");
            if (tokens.length > 0) {
                String cmd = tokens[0];
                if (serverCommands.containsKey(cmd)) {
                    Command c = serverCommands.get(cmd);
                    c.execute(tokens);
                } else {
                    String invCmd = "Invalid command: " + tokens[0] + "\n";
                    sendStream.write(invCmd.getBytes());
                }
            }
        }
    }

Связана ли проблема с тем, что два потока запрашивают один и тот же ресурс?

...