2011-07-11 104 views
2

如果通过Socket连接的客户端具有较差的延迟,会发生什么情况? 假设我从TCP服务器调用socket.read(),并且客户端在网络管道上写入了一些内容,但他的连接持续了1或2分钟。会发生什么 ? read会失败吗?还是会等待?我不确定是否有可能,但我在FICS服务器上玩在线国际象棋,有时它似乎从我的角度来看(我只是这个国际象棋服务器的用户)。读取期间Java套接字超时

我在问这个,因为我在网络游戏上工作,我想以这种或那种方式处理这种情况。但首先我需要知道:

  • 它可以发生
  • 可以检测

感谢

回答

2

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

使用心跳机制还允许您通过监视每端接收心跳消息的延迟来测量延迟。

+0

这就是我要做的 – Joel

+0

我只是在想...这太糟糕了,它并没有包含在普通的TCP – Joel

+0

是的,这令人沮丧,但我可以理解为什么它不是协议的一部分,因为不同的应用程序有不同的要求。 – Adamski

1

read() - 方法将发生阻塞。但有setSoTimeout()-method可用于设置可处理的超时。

+0

我知道这个选项,但它如何帮助区分滞后与缺少活动? – Joel

+0

我不认为你可以。您可以使用超时缓冲延迟,如果没有响应,则需要假定客户端没有任何东西进来。 –

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