我正在创建一个应用程序,其中客户端向服务器发送消息,然后等待5秒钟(假设)让服务器响应,如果没有返回消息,则重试。如果服务器响应该消息,则客户端处理它。这在循环中继续,并在一段时间后再次发生。
为此我想在客户端套接字上使用setSoTimeout(time),但在阅读了javadoc和互联网上的大量解释之后,我对这种方法是否正确感到困惑。
我在互联网上看到的内容
(1)如果我在套接字上使用setSoTimeout,那么它会给出需要建立连接的持续时间的超时,如果没有建立,则它会重试在给定时间内建立连接。
(2)如果我在套接字上使用setSoTimeout,那么它会在指定的时间间隔内等待传入消息,如果没有收到消息,则它会停止等待。
我的问题是 -
(1)上述哪一项属实?
(2)如果第二个陈述为真,那么我可以将它用于我的实现吗?
(3)如果第二个语句为真,那么超时计时器何时启动呢?是在我声明套接字并在其上设置超时时间时,还是在我发送消息时?
如果其中一个解释不适用于我的情况,那么我应该做些什么来等待客户端的固定时间间隔让服务器回复?如果回复确实来了,我应该处理它并继续并重做相同的过程。如果答复没有到来,我应该继续前进并重新完成整个过程。
答案 0 :(得分:-1)
(1)如果我在套接字上使用
setSoTimeout()
,那么它会给出需要建立连接的持续时间的超时,如果没有建立,那么它会重试在给定时间内建立连接
这是不正确的。 setSoTimeout()
根本不会导致重新建立连接,更不用说“在给定时间内”。
(2)如果我在套接字上使用
setSoTimeout()
,它会在指定的时间间隔内等待传入的消息,如果没有收到消息,则它会停止等待。
这稍微准确一些,但TCP中没有消息。
正确的解释是,它会阻止至少一个字节到达的指定超时。如果超时内没有任何内容,则抛出SocketTimeoutException
。
(1)上述哪一项属实?
都不是。
(2)如果第二个陈述为真,那么我可以将它用于我的实现吗?
不是,所以第二部分不适用,但如果任何陈述为真,您可以将其用作实施的一部分。你不必问。
(3)如果第二个语句为真,那么超时计时器何时启动呢?
致电read()
。
当我声明套接字并在其上设置超时时间时,还是在我发送消息时?
都不是。
如果其中一个解释不适用于我的情况,那么我应该做些什么来等待客户端的固定时间间隔让服务器回复?
设置读取超时。