TCP通信客户端Socket 心跳线程的实现

流子
游戏开发领域优质创作者
博客专家认证
2008-07-24 05:56:53
如果自己去实现心跳功能其实最土的办法是隔一定时间向服务端发送一个心跳包,然后服务端如果收到了,服务端就发送一个响应信号,如果客户端在一定的时间间隔内取得了这个响应,那么连接是正常的,如果没有取得,那么重连这个socket.
我想如果JDK已经实现了这个功能的话,那我就没必要自己再去造轮子了。

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

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


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

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();
}
}


}

...全文
3057 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我对此也表示无语!!!
adonis1620 2010-10-13
  • 打赏
  • 举报
回复
定。。。。。。。。。
ziyuan008 2008-07-29
  • 打赏
  • 举报
回复
只能自己写心跳程序的
jdlsfl 2008-07-25
  • 打赏
  • 举报
回复
学习
hmsuccess 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sagezk 的回复:]
以下摘自 JDK API 文档:

为 TCP 套接字设置 keepalive 选项时,如果在 2 个小时(注:实际值与实现有关)内在任意方向上都没有跨越套接字交换数据,则 TCP 会自动将 keepalive 探头发送到同位体。此探头是同位体必须响应的 TCP 段。
期望的响应为以下三种之一:
1. 同位体通过期望的 ACK 响应。不通知应用程序(因为一切正常)。在另一个 2 小时的不活动时间过后,TCP 将发送另一个探头。
2. 同位体通过 RST 响应,通…
[/Quote]
学习
流子 2008-07-24
  • 打赏
  • 举报
回复
我们知道,TCP有一个连接检测机制,就是如果在指定的时间内(一般为2个小时)没有数据传送,会给对端发送一
个Keep-Alive数据报,使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号,对端如果收到这个数据
,回送一个TCP的ACK,确认这个字节已经收到,这样就知道此连接没有被断开。如果一段时间没有收到对方的响应
,会进行重试,重试几次后,向对端发一个reset,然后将连接断掉。
  在Windows中,第一次探测是在最后一次数据发送的两个小时,然后每隔1秒探测一次,一共探测5次,如果5次
都没有收到回应的话,就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。
还有我发现我使用这API有点误用,因为getKeepAlive()的作用是返回:指示是否启用 SO_KEEPALIVE 的 boolean 值。这明显不是我的本意,看来我只能自己写心跳包了,各路英雄好汉,你们有什么好的办法吗?
qiuke007 2008-07-24
  • 打赏
  • 举报
回复
应该在2台机子那测试1下的
sagezk 2008-07-24
  • 打赏
  • 举报
回复
以下摘自 JDK API 文档:

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

更多说明参见 java.net.SocketOptions 接口。
ldt_love_java 2008-07-24
  • 打赏
  • 举报
回复
学习......
Pol 2008-07-24
  • 打赏
  • 举报
回复
也没有听说这个东东...

我想这样定会产生阻塞..
最牛傻蛋 2008-07-24
  • 打赏
  • 举报
回复
心跳,第一次听说这个名词
lovingprince 2008-07-24
  • 打赏
  • 举报
回复
所谓超时其实都是定时检测。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧