JAVA:何时使用Socket setSoTimeout?

问题描述 投票:0回答:1

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

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

我在互联网上看到的

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

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

我的问题是 -

(1)以上哪项是真的?

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

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

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

java sockets client-server
1个回答
-1
投票

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

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

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

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

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

(1)以上哪项是真的?

都不是。

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

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

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

当你打电话给read()

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

都不是。

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

设置读取超时。

© www.soinside.com 2019 - 2024. All rights reserved.