Тайм-аут для SocketChannel не работает - PullRequest
15 голосов
/ 19 мая 2010

Я хочу использовать SocketChannel и иметь таймаут для методов чтения / записи. Я попытался установить время ожидания для Socket, которому принадлежит мой SocketChannel, например:

channel.socket().setSoTimeout(TIMEOUT);

но это не работает. Есть ли другое решение?

Ответы [ 3 ]

14 голосов
/ 05 февраля 2012

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

SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);

чтение из wrappedChannel будет прервано в соответствии с установленным параметром socketTimeOut.

2 голосов
/ 22 августа 2013

Если вы знакомы с использованием Java Selector, вы можете эмулировать время ожидания сокета самостоятельно, используя селектор. Полезно увидеть sun.nio.ch.SocketAdaptor.

Следует осторожно использовать Thread.interrupt (). SocketChannel является InterruptibleChannel. Когда вы читаете описание InterruptibleChannel, Thread.interrupt () вызывает close SocketChannel. Если вы хотите использовать SocketChannel после истечения времени ожидания, вы не можете использовать функцию InterruptibleChannel.

0 голосов
/ 15 октября 2012

Вы также можете рассмотреть возможность сделать ваш канал неблокируемым и просто использовать System.currentTimeMillis ().

...