【问题标题】:JAVA : When to use Socket setSoTimeout?JAVA:何时使用 Socket setSoTimeout?
【发布时间】:2016-07-28 09:33:15
【问题描述】:

我正在制作一个应用程序,客户端向服务器发送一条消息,然后等待 5 秒(假设)服务器响应,如果没有返回消息,它会再次重试。如果服务器用消息响应,则客户端处理它。这会循环进行,并在一段时间后再次发生。

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

我在网上看到的

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

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

我的问题是 -

(1) 以上哪项是正确的?

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

(3) 如果第二个陈述为真,超时计时器究竟是什么时候开始的?是在我声明套接字并设置超时时间的时候,还是在我发送消息的时候?

如果任何一种解释都不适用于我的情况,那么我应该怎么做才能在客户端等待固定的时间间隔让服务器回复?如果回复确实来了,我应该处理它并继续并重做相同的过程。如果没有回复,我应该继续并重新完成整个过程。

【问题讨论】:

    标签: java sockets client-server


    【解决方案1】:

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

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

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

    这个稍微准确一点,但是 TCP 中没有消息这样的东西。

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

    (1) 以上哪项是正确的?

    都没有。

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

    并非如此,因此第二部分不适用,但如果任何陈述为真,您可以将其用作实现的一部分。你不必问。

    (3) 如果第二个陈述为真,那么超时计时器究竟是什么时候开始的?

    当您拨打read()时。

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

    都没有。

    如果任何一种解释都不适用于我的情况,那么我应该怎么做才能在客户端等待固定的时间间隔让服务器回复?

    设置读取超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2017-08-19
      • 2012-05-31
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多