IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

web socket 心跳包的实现方案

Zend Studio 2010-05-31 23:58:49 累计浏览 5,964 次
本机暂存

现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我们只是做一个简单的聊天室,但我们让他稳定可靠一些一点也没有错。

我的心跳包方案很是简单,原理就是间隔发送心跳包数据给服务器,服务器在一定时间内发回心跳包响应,对比超时限定,如果超过设定的超时时间,则认为当前与服务器的websocket连接已经断开,关闭当前web socket连接,善后处理,例如重新连接,或者弹出提示……

比较有用的核心代码是这样子的:

function keepalive( ws ){
	var time = new Date();
	if( last_health != -1 && ( time.getTime() - last_health > health_timeout ) ){
			//此时即可以认为连接断开,可设置重连或者关闭连接
			$("#keeplive_box").html( "服务器没有响应." ).css({"color":"red"});
			//ws.close();
	}
	else{
		$("#keeplive_box").html( "连接正常" ).css({"color":"green"});
		if( ws.bufferedAmount == 0 ){
			ws.send( '~H#C~' );
		}
	}
}

这就是心跳函数,发送心跳包和检测心跳健康度。我们将其植入到websocket的onopen事件中,来开启心跳检测。像这样:

var ws = new WebSocket( to_url );
  ws.onopen=function(){
		$("#statustxt").html("connected.");
		$("#send_btn").attr("disabled", false);
		heartbeat_timer = setInterval( function(){keepalive(ws)}, 1000 );
	}

是的,这样子就可以实现web socket的心跳包,这里有些类似于多线程的发送方式,在发送心跳包的同时,并不影响正常的数据通信,我们的例子还是以上次的websocket聊天室来改进,我们可以发现,心跳包运行过程中,并不会干扰到我们的正常聊天。服务端我也进行了一些修改,原理类似,在超过一定时间内都没有收到客户端发来的心跳包,则认为该客户端已经掉线,关闭连接,收回资源。

Demo在这里:http://www.zendstudio.net/libs/websocket/chat/demo2.html

现在,有一个新的问题出现,如果我们要用php socket来模拟心跳包技术,该怎么实现?各位路过的朋友请多指教,感恩戴德。

同分类推荐文章

  1. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

  1. libcurl的使用总结(二) (累计阅读 15,002)
  2. websocket 连接 C Server的尝试 (累计阅读 7,864)
  3. 一种基于长连接的社交游戏服务器程序构架 (累计阅读 7,427)
  4. 浅析linux kernel network之socket创建 (累计阅读 6,682)
  5. TCP链接主动关闭不发fin包奇怪行为分析 (累计阅读 6,640)
  6. TCP之close_wait (累计阅读 6,447)
  7. iPhone下的libcurl with SSL for iOS (累计阅读 6,264)
  8. websocket 通信协议 (累计阅读 6,220)
  9. libevent源码浅析: http库 (累计阅读 6,123)
  10. 使用socket.io和node.js搭建websocket应用 (累计阅读 5,180)