Таймаут сокета Java во время чтения - PullRequest
2 голосов
/ 12 июля 2011

Что произойдет, если клиент, подключенный через Socket, имеет плохую задержку?Допустим, я звоню socket.read() с TCP-сервера, и клиент записывает некоторые данные в сетевой канал, но его соединение задерживается на 1 или 2 минуты.Что случится ?read потерпит неудачу?Или это подождет?

Я не уверен, что это вообще возможно, но я играю в онлайн-шахматы на сервере FICS, и иногда, кажется, это происходит с моей точки зрения (я всего лишь пользовательэтот шахматный сервер).

Я спрашиваю об этом, потому что я работаю над онлайн-игрой, и я бы хотел так или иначе разбираться с такими случаями.Но сначала мне нужно знать, если:

  • это может произойти
  • это может быть обнаружено

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Я бы посоветовал не полагаться исключительно на установку переменной SO_TIMEOUT, а скорее добавлять тактовые импульсы на уровне приложения между вашим клиентом и сервером. Если либо клиент, либо сервер не получают сообщение пульса в течение определенного времени (например, в пределах удвоенной частоты пульса), он должен разорвать соединение, а в случае клиента попытаться повторно установить соединение.

Использование механизма сердцебиения также позволяет измерять задержку, отслеживая задержку получения сообщений сердцебиения на каждом конце.

1 голос
/ 12 июля 2011

Метод read() заблокируется. Но есть setSoTimeout() -метод , который можно использовать для установки времени ожидания, которое можно обработать.

0 голосов
/ 19 июля 2012

На самом деле, использование setSoTimeout() может вводить в заблуждение. Когда вы используете его таким образом:

Socket sock = new Socket(host, port);
sock.setSoTimeout(3000); // 3 seconds timeout

Конструктор инициирует connect (), а время ожидания не было установлено. Вместо ожидаемого тайм-аута в 3 секунды вы получаете значение по умолчанию. Чтобы получить желаемое время ожидания, вы можете сделать это следующим образом:

SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket sock = new Socket();
sock.connect(sockaddr, 3000); // 3 seconds timeout
...