读取期间的Java套接字超时

时间:2011-07-11 21:15:23

标签: java sockets tcp timeout

如果通过Socket连接的客户端出现严重滞后,会发生什么? 假设我从TCP服务器调用socket.read(),客户端在网络管道上写入一些内容,但他的连接持续1或2分钟。会发生什么 ? read会失败吗?还是会等待?

我不确定它是否可能,但我在FICS服务器上玩在线国际象棋,有时它似乎发生在我的观点(我只是这个国际象棋服务器的用户)。

我问这个是因为我正在开发一款在线游戏,而且我想以这种或那种方式处理这类案件。但首先我需要知道是否:

  • 可能发生
  • 可以检测到

由于

3 个答案:

答案 0 :(得分:2)

我建议不要仅依赖于设置SO_TIMEOUT变量,而是在客户端和服务器之间添加应用程序级心跳。如果客户端或服务器在指定时间内没有收到心跳消息(例如,在心跳频率的两倍之内),它应该切断连接,并在客户端的情况下尝试重新连接。

使用心跳机制还可以通过监视每端接收心跳消息的延迟来衡量延迟。

答案 1 :(得分:1)

read() - 方法将阻止。但是setSoTimeout()-method可用于设置可以处理的超时。

答案 2 :(得分:0)

实际上,使用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