Есть ли способ прочитать входные данные за определенное время? - PullRequest
4 голосов
/ 03 марта 2011

У меня есть ситуация, когда поток открывает соединение telnet с целевым m / c и считывает данные из программы, которая выплевывает все данные в своем буфере.После удаления всех данных целевая программа печатает маркер.Мой поток продолжает искать этот маркер, чтобы закрыть соединение (успешное чтение).

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

Поэтому я хочу читать данные только в течение определенного периода времени (скажем, 15 минут / настраивается).Есть ли способ сделать это на уровне API Java?

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

Как правило, нет. Входные потоки не обеспечивают функцию тайм-аута.

Однако, в вашем конкретном случае, то есть чтение данных из сокета, да. Что вам нужно сделать, это установить SO_TIMEOUT на вашем сокете в ненулевое значение (тайм-аут, который вам необходим в миллисекундах). Любые операции чтения, которые блокируют в течение указанного времени, выдают SocketTimeoutException.

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

2 голосов
/ 03 марта 2011

Если вы используете Java Socket для общения, вам следует взглянуть на метод setSoTimeout (int) .

Операция read () на сокете будет блокироваться только на указанное время. После этого, если информация не получена, будет поднят java.net.SocketTimeoutException, и при правильном обращении выполнение будет продолжено.

2 голосов
/ 03 марта 2011

Используйте другой поток, чтобы закрыть соединение через 15 минут. В качестве альтернативы, вы можете проверить после каждого чтения, прошло ли 15 минут, а затем просто прекратить чтение и очистить соединение, но это будет работать, только если вы уверены, что удаленный сервер продолжит отправлять данные (если этого не произойдет, чтение заблокирует на неопределенный срок).

0 голосов
/ 03 марта 2011

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

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

...