• 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());
}
}
}
}
Связана ли проблема с тем, что два потока запрашивают один и тот же ресурс?