У меня есть простой сервер сокетов и клиент, настроенный на Java. Я хочу реализовать метод, который проверяет тайм-аут соединения. Обычно клиент отправляет серверу 01101011 01100101 01100101 01110000
каждые 5 секунд. Затем сервер проверяет, установлено ли уже соединение с клиентом, от которого он получил строку.
В противном случае он добавляет IP-адрес клиента в массив с именем connections
и запускает 30-секундный таймер. Если 30-секундный таймер достигнет конца, он удалит клиента из массива connections
.
В противном случае, если у него уже установлено соединение с клиентом, он отменяет 30-секундный таймер и перезапускает его.
Это мой код:
//This if statement fires every 5 seconds when it received the string from the client
if(o.equals("01101011 01100101 01100101 01110000")) {
Timer timeoutTimer = new Timer();
if(Arrays.asList(connections).contains(connection.getOtherEnd().getAddress())) {
timeoutTimer.cancel();
timeoutTimer.purge();
timeoutTimer = new Timer();
}
else {
connections = ArrayModification.append(connections, connection.getOtherEnd().getAddress());
System.out.println("Client connected");
}
timeoutTimer.schedule(new TimerTask() {
@Override
public void run() {
connections = ArrayModification.remove(connections, connection.getOtherEnd().getAddress());
System.out.println("Client disconnected");
}
}, 30000);
}
Он работает нормально около 30 секунд, но затем по какой-то причине выполняет задачи таймера, которые должны были быть отменены.
Вот мой результат:
Client connected <- Happens when the client first connects
Client disconnected <- Happens 30 seconds later from the timer task that should've been cancelled
Client connected
Client disconnected
Client connected
Client disconnected
Client connected
Я не мог понять, почему отмененные таймеры все еще работают. Любая помощь будет оценена по достоинству!
if
, вы создаете новыйTimer
, чтобы отменить только что созданный новый экземпляр, а не тот, который мог быть создан ранее. - person MadProgrammer   schedule 30.05.2021else
, а затем исключив ветвьif
путем отрицания условия. - person Turing85   schedule 30.05.2021Timer timeoutTimer = new Timer();
затеняет все остальное, что может быть объявлено глобально, поэтому, когда они вызываютtimeoutTimer.cancel
, они отменяют экземпляр NEW, а не любой из ранее созданных. Затем они создают ДРУГОЙ экземпляр (так что теперь их два). Я также нигде не вижу, чтобы они создавали эту ссылку, чтобы использовать ее позже. Так что прямо сейчас они не отменяют ранее созданный таймер, так как у них НЕТ ссылки на него - так что это просто беспорядок. - person MadProgrammer   schedule 30.05.2021