读取期间Java套接字超时
如果通过读取期间Java套接字超时,java,sockets,tcp,timeout,Java,Sockets,Tcp,Timeout,如果通过套接字连接的客户端出现严重延迟,会发生什么情况? 假设我从TCP服务器调用socket.read(),客户端在网络管道上写了一些东西,但是他的连接延迟了1到2分钟。会发生什么?读取是否会失败?还是等待 我甚至不确定这是否可能,但我在FICS服务器上玩在线象棋,有时从我的角度看,这似乎是真的(我只是这个象棋服务器的用户) 我问这个问题是因为我在做一个在线游戏,我想以这样或那样的方式处理这种情况。但首先我需要知道: 这是可能发生的 它可以被检测到 谢谢read()-方法将被阻止。但是有一
套接字连接的客户端出现严重延迟,会发生什么情况?
假设我从TCP服务器调用socket.read()
,客户端在网络管道上写了一些东西,但是他的连接延迟了1到2分钟。会发生什么?读取是否会失败?还是等待
我甚至不确定这是否可能,但我在FICS服务器上玩在线象棋,有时从我的角度看,这似乎是真的(我只是这个象棋服务器的用户)
我问这个问题是因为我在做一个在线游戏,我想以这样或那样的方式处理这种情况。但首先我需要知道:
- 这是可能发生的
- 它可以被检测到
谢谢read()
-方法将被阻止。但是有一种方法可以用来设置可以处理的超时。我建议不要仅仅依靠设置SO\u timeout
变量,而是在客户端和服务器之间添加应用程序级心跳。如果客户机或服务器在指定时间内(例如,在心跳频率的两倍内)未收到心跳消息,则应断开连接,并在客户机的情况下尝试重新连接
使用心跳机制还可以通过监测每一端接收心跳消息的延迟来测量延迟。实际上,使用setSoTimeout()
可能有点误导。以这种方式使用时:
Socket sock = new Socket(host, port);
sock.setSoTimeout(3000); // 3 seconds timeout
构造函数启动connect(),但尚未设置超时。您得到的不是预期的3秒超时,而是默认超时。要获得所需的超时,可以按以下方式执行:
SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket sock = new Socket();
sock.connect(sockaddr, 3000); // 3 seconds timeout
我知道这个选项,但它如何帮助区分活动滞后和缺乏活动?我认为你做不到。你可以使用超时来缓冲延迟,如果没有响应,你需要假设没有任何东西来自客户端。我只是在想。。。很遗憾,它没有包含在普通的TCPYes中,这很令人沮丧,但我可以理解为什么它不是协议的一部分,因为不同的应用程序有不同的需求。