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

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

 channel.socket().setSoTimeout(TIMEOUT); 

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

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

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

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

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

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

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

Давайте будем гением компьютера.