日期:2014-05-20  浏览次数:20711 次

TCP通信客户端Socket 心跳线程的实现
如果自己去实现心跳功能其实最土的办法是隔一定时间向服务端发送一个心跳包,然后服务端如果收到了,服务端就发送一个响应信号,如果客户端在一定的时间间隔内取得了这个响应,那么连接是正常的,如果没有取得,那么重连这个socket.
我想如果JDK已经实现了这个功能的话,那我就没必要自己再去造轮子了。

参考了一下网上的资料,说是socket.setKeepAlive(true)就实现了心跳包的发送功能,我不知道这个API每隔多少时间去发送一次,还是这种用法有些误解,我假定这种用法是对的,那么,心跳时间间隔我自己实现:
在Client中

心跳线程中的
Java code
Socket socket= Socket("127.0.0.1",8080);
socket.setKeepAlive(true);



run里如下实现,每隔60秒触发一下,

Java code
public void run{

while(true){
if(socket.getKeepAlive){

System.out.println("Client connect to Server is OK");
}else{
socket=soket("127.0.0.1",8080);
}


try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}




------解决方案--------------------
所谓超时其实都是定时检测。
------解决方案--------------------
心跳,第一次听说这个名词
------解决方案--------------------
也没有听说这个东东...

我想这样定会产生阻塞..
------解决方案--------------------
学习......
------解决方案--------------------
以下摘自 JDK API 文档:

为 TCP 套接字设置 keepalive 选项时,如果在 2 个小时(注:实际值与实现有关)内在任意方向上都没有跨越套接字交换数据,则 TCP 会自动将 keepalive 探头发送到同位体。此探头是同位体必须响应的 TCP 段。
期望的响应为以下三种之一:
1. 同位体通过期望的 ACK 响应。不通知应用程序(因为一切正常)。在另一个 2 小时的不活动时间过后,TCP 将发送另一个探头。
2. 同位体通过 RST 响应,通知本地 TCP 同位体主机已崩溃并重新启动。套接字被关闭。
3. 同位体没有响应。套接字被关闭。 此选项的目的是检测同位体主机是否崩溃。 仅对 TCP 套接字(SocketImpl)有效。

更多说明参见 java.net.SocketOptions 接口。
------解决方案--------------------
应该在2台机子那测试1下的
------解决方案--------------------
探讨
以下摘自 JDK API 文档:

为 TCP 套接字设置 keepalive 选项时,如果在 2 个小时(注:实际值与实现有关)内在任意方向上都没有跨越套接字交换数据,则 TCP 会自动将 keepalive 探头发送到同位体。此探头是同位体必须响应的 TCP 段。
期望的响应为以下三种之一:
1. 同位体通过期望的 ACK 响应。不通知应用程序(因为一切正常)。在另一个 2 小时的不活动时间过后,TCP 将发送另一个探头。
2. 同位体通过 RST 响应,通…

------解决方案--------------------
学习
------解决方案--------------------
只能自己写心跳程序的