Тайм-аут для 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().