Проект
В общем вот ссылка на проект, реализована игра быки-коровы:
сервер генерирует "слово" из 4 цифр, а клиент пытается его отгадать. Налажено подключение и отключение. Но не могу реализовать тайм аут, если пользователь или сервер долгое время не получали сообщений.
Максимум что удавалось, это в контроллере Клиента вызывать в методе нажатия кнопки после считывая данных функцию setOutTimeout, или которая бы сверяла System.currentMills заданную перед проверкой и после, все в целом отрабатывает и закрывает сокет, но появляется ошибка в Моделе: Stream closed.
Ответ
В общем, реализовал как смог, с помощью костылей.
class TimeoutThread extends Thread {
private final int time;
private boolean isStop = false;
public TimeoutThread(int time) {
super();
this.time = time;
}
public void stopCheckTimeout() {
this.isStop = true;
}
@Override
public void run() {
try {
System.out.println("start");
long endTime = System.currentTimeMillis() + time;
count = time / 1000;
while (!isStop) {
count--;
Thread.sleep(1000);
System.out.println("ooo");
ClientPresenter.getInstance().handleResult(String.valueOf(count));
if (System.currentTimeMillis() > endTime) {
System.out.println("disc");
disconnect();
break;
}
}
System.out.println("finish");
} catch (Exception e) {
e.printStackTrace();
}
}
И использовал:
new Thread(() -> {
TimeoutThread timeoutThread = new TimeoutThread(10000);
while (status) {
try {
if (isReceive()) {
timeoutThread.stopCheckTimeout(); //stop current timeout
boolean gameFinished = check();
if(gameFinished) {
return;
}
timeoutThread = new TimeoutThread(10000); // start new
timeoutThread.start();
}
} catch (Exception e) {
status = false;
}
}
}).start();
Комментариев нет:
Отправить комментарий