Тайм-аут для SocketChannel не работает

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

channel.socket().setSoTimeout(TIMEOUT);

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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