开发者

Timeout for SocketChannel doesn't work

开发者 https://www.devze.com 2022-12-31 13:09 出处:网络
I want to use a SocketChannel and to have a timeout for its read/write methods. I\'ve tried to set a timeout for the Socket that owns my SocketChannel like this:

I want to use a SocketChannel and to have a timeout for its read/write methods. I've tried to set a timeout for the Socket that owns my SocketChannel like this:

channel.socket().setSoTimeout(TIMEOUT);

but that doesn't work. Is there any other s开发者_Go百科olution?


According to this article, SocketChannel will not timeout for its read operation but you can get this effect from reading from the channel in another way.

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

reading from the wrappedChannel will timeout according to the socketTimeOut you have set.


If you are familiar with using Java Selector, you can emulate socket timeout yourself using selector. It is helpful to see sun.nio.ch.SocketAdaptor.

It should be careful to use Thread.interrupt(). SocketChannel is InterruptibleChannel. As you read the description of InterruptibleChannel, Thread.interrupt() causes to close SocketChannel. If you want to use SocketChannel after timeout, you cannot use the InterruptibleChannel feature.


You could also consider making your channel non-blockable and just using System.currentTimeMillis().

0

精彩评论

暂无评论...
验证码 换一张
取 消