Страницы

Поиск по вопросам

вторник, 19 марта 2019 г.

Java socket timeout

Проект
В общем вот ссылка на проект, реализована игра быки-коровы: сервер генерирует "слово" из 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();

Комментариев нет:

Отправить комментарий