2013-03-12 37 views
2

如果我在java套接字上设置soTimeout,主动对等对被动对等体的行为将会是什么。例如,如果我有一个readtimeout值1分钟,并有一个文件传输,并需要5分钟,它会得到readtimeout异常或不?对于我来说,当连接挂起时它有必要获得超时异常。java套接字超时行为

+0

“被动同伴”是什么意思? TCP中的“被动”用于指代监听套接字,它根本没有读取或读取超时。 – EJP 2013-03-12 22:28:47

回答

3

soTimeout设置显式影响从套接字输入流中读取的操作。您可以将其视为允许调用者在读取操作中定义一个定时块。从Javadoc获取setSoTimeout

使用指定的超时(以毫秒为单位)启用/禁用SO_TIMEOUT。 如果将此选项设置为非零超时,则与此套接字关联的 InputStream上的read()调用将仅阻塞此 时间量。如果超时到期,将引发一个 java.net.SocketTimeoutException异常,但Socket仍然是 有效。

在被动对等体的情况下,由于对等体没有调用read,所以不会引发超时。但是,如果它确实进行了读取调用,则调用必须在soTimeout到期之前返回数据,否则将引发SocketTimeoutException。

+0

谢谢。为了清楚起见,如果我设置readtimeout 1分钟并在套接字上调用read(),则即使服务器继续在另一端写入,此方法也会引发异常。是对的吗 ? – cacert 2013-03-12 14:37:11

+0

@cacert - 好吧,不一定。超时时间取决于* client *端的阻塞读取等待的时间。所以,如果你的服务器正在写数据,但由于某种原因,它在'soTimeout'启动之前不会显示在客户端缓冲区中,那么是的话,就会引发一个异常。但只要客户端'read'在超时之前返回一些数据,就不会引发异常。 – Perception 2013-03-12 14:52:18

+0

好的,这是可以接受的。那么我认为我们可以说,超时以某种方式与非活动会话相关,如果我们有一个长时间但活动的会话(我们定期在超时持续时间之前每次检索数据),那么读取超时将不成问题。谢谢。 – cacert 2013-03-13 06:49:26