JAVA:何时使用Socket setSoTimeout?

时间:2016-07-28 09:33:15

标签: java sockets client-server

我正在创建一个应用程序,其中客户端向服务器发送消息,然后等待5秒钟(假设)让服务器响应,如果没有返回消息,则重试。如果服务器响应该消息,则客户端处理它。这在循环中继续,并在一段时间后再次发生。

为此我想在客户端套接字上使用setSoTimeout(time),但在阅读了javadoc和互联网上的大量解释之后,我对这种方法是否正确感到困惑。

我在互联网上看到的内容

  

(1)如果我在套接字上使用setSoTimeout,那么它会给出需要建立连接的持续时间的超时,如果没有建立,则它会重试在给定时间内建立连接。

     

(2)如果我在套接字上使用setSoTimeout,那么它会在指定的时间间隔内等待传入消息,如果没有收到消息,则它会停止等待。

我的问题是 -

(1)上述哪一项属实?

(2)如果第二个陈述为真,那么我可以将它用于我的实现吗?

(3)如果第二个语句为真,那么超时计时器何时启动呢?是在我声明套接字并在其上设置超时时间时,还是在我发送消息时?

如果其中一个解释不适用于我的情况,那么我应该做些什么来等待客户端的固定时间间隔让服务器回复?如果回复确实来了,我应该处理它并继续并重做相同的过程。如果答复没有到来,我应该继续前进并重新完成整个过程。

1 个答案:

答案 0 :(得分:-1)

  

(1)如果我在套接字上使用setSoTimeout(),那么它会给出需要建立连接的持续时间的超时,如果没有建立,那么它会重试在给定时间内建立连接

这是不正确的。 setSoTimeout()根本不会导致重新建立​​连接,更不用说“在给定时间内”。

  

(2)如果我在套接字上使用setSoTimeout(),它会在指定的时间间隔内等待传入的消息,如果没有收到消息,则它会停止等待。

这稍微准确一些,但TCP中没有消息。

正确的解释是,它会阻止至少一个字节到达的指定超时。如果超时内没有任何内容,则抛出SocketTimeoutException

  

(1)上述哪一项属实?

都不是。

  

(2)如果第二个陈述为真,那么我可以将它用于我的实现吗?

不是,所以第二部分不适用,但如果任何陈述为真,您可以将其用作实施的一部分。你不必问。

  

(3)如果第二个语句为真,那么超时计时器何时启动呢?

致电read()

  

当我声明套接字并在其上设置超时时间时,还是在我发送消息时?

都不是。

  

如果其中一个解释不适用于我的情况,那么我应该做些什么来等待客户端的固定时间间隔让服务器回复?

设置读取超时。