Тайм-аут записи в сокет Java / Groovy - PullRequest
3 голосов
/ 11 июня 2009

У меня есть простой плохо ведущий себя сервер (написанный на Groovy)

ServerSocket ss = new ServerSocket(8889);
Socket s = ss.accept()
Thread.sleep(1000000)

И клиент, для которого я хочу получить тайм-аут (поскольку сервер не потребляет входные данные)

Socket s = new Socket("192.168.0.106", 8889)
s.setSoTimeout(100);
s.getOutputStream.write( new byte[1000000] );

Однако этот клиент блокируется навсегда. Как я могу получить клиенту тайм-аут?

СПАСИБО !!

Ответы [ 3 ]

3 голосов
/ 11 июня 2009

Вы можете порождать клиента в его собственном потоке и вращать блокировку / ожидание (тайм-аут) для его возврата. Возможно использование объекта Future для получения возвращаемого значения, если Socket успешен.

Я верю, что настройка SO_TIMEOUT для Socket влияет только на вызовы чтения (..) из сокета, а не на запись.

Вы можете попробовать использовать SocketChannel (а не Stream) и порождать другой поток, который также имеет дескриптор этого канала. Другой поток может асинхронно закрыть этот канал после того, как определенный тайм-аут его заблокирован.

1 голос
/ 11 июня 2009

Тайм-аут сокета находится на уровне TCP, а не на уровне приложения. TCP исходного компьютера буферизует данные, подлежащие отправке, а сетевой стек целевой машины подтверждает получение полученных данных, поэтому время ожидания отсутствует. Кроме того, разные реализации TCP / IP обрабатывают эти таймауты по-разному. Посмотрите, что происходит в сети, с помощью tcpdump (или wireshark , если вам не повезло :) Что вам нужно, так это ACK уровня приложения, т.е. клиент и сервер. Я не могу комментировать пакеты Java (вы, вероятно, хотите посмотреть nio ), но тайм-аут получения этого ACK обычно обрабатывается с помощью poll / select .

0 голосов
/ 12 июня 2009

Нет способа получить тайм-аут, но вы всегда можете создать поток, который закрывает соединение, если запись еще не закончена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...