zoukankan      html  css  js  c++  java
  • web socket 心跳包的实现方案

    web socket 心跳包的实现方案05/30/2010

    现在网络环境错综复杂,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://img.zendstudio.net/libs/websocket/chat/demo2.html

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

    3条评论 标签:  

    3条评论
      1. Sweet

        您好!代码字体很舒服,能告诉我是哪种字体吗?我用的是zend studio 5.5.1,可以修改成文章中的代码字体吗?谢谢!

      2. yahveh

        无形中加重负担了吧,php的socket效率真不怎么样
        WebSocket.class.php
        private $Connection=array();
        $c = new Connection;
        $c->sock = socket_accept($this->Master);
        if $buffer == ‘~H#C~’ $c->atime=time()
        $Connection[] = $c;

        then

        while($true){
        $time = time();
        foreach ($Connection as $c)
        {
        if ($c->atime + 20 sock);}
        }
        }

        Connection.class.php
        class Connection
        {
        public $sock;
        public $atime = time();
        }

        应该看得懂吧,也不知道行不行,明天去测试下…

        • 为了稳定可靠,这个负载牺牲是必须的。php socket目前属于玩具级水平,我仅将其用于测试(BTW:实际上我们的实际生产中也有使用php socket来作为服务器,只是结合了C,所以也不完全属于php socket范畴了)。伪代码意思看的懂。

  • 相关阅读:
    剪绳子
    一步一步创建聊天程序2-利用epoll来创建简单的聊天室
    一步一步创建聊天程序1-利用进程和共享内存来创建简易聊天程序
    重写二路归并排序
    数据结构中的参见排序算法的实现,以及时间复杂度和稳定性的分析(2)
    数据结构中的参见排序算法的实现,以及时间复杂度和稳定性的分析(1)
    fork函数的一些小结
    LRU的实现(使用list)
    关于一道fork生成子进程的题目
    【转载】C++编译过程
  • 原文地址:https://www.cnblogs.com/fx2008/p/4105413.html
Copyright © 2011-2022 走看看