基于websocket的协议,服务端未完全启动时, client连接失败后调用reconnect无效!

zhouciming

服务端未完全启动时, client连接失败后调用reconnect后,虽然connect成功的,但是发送数据服务端并不能接收到,这是为什么?
 
在onClose中我应该怎么写才能保证接下来发送数据能成功呢?

4070 1 0
1个回答

phpcreeper

给你个样板代码,照猫画虎吧:

<script type="text/javascript">
    var ws, timer_id1, time_id2;

    //连接服务端
    function connect() {
       //创建websocket
       ws = new WebSocket("ws://"+document.domain+":8888");

       //当socket连接打开时
       ws.onopen = onopen;

       //当有消息时根据消息类型显示不同信息
       ws.onmessage = onmessage; 

       ws.onclose = function(e) {
          console.log("连接关闭,定时重连");
          timer_id1 = setInterval(function(){
            connect();
          }, 5000);
          timer_id2 && clearInterval(timer_id2);
       };

       ws.onerror = function() {
          console.log("出现错误");
       };

       //客户端主动发送心跳
       var timer_id2 = setInterval(function(){
           console.log("客户端定时发送心跳包");
           ws.send('{"type":"ping"}');
       }, 20000);
    }

    //连接建立时发送数据
    function onopen() {
        timer_id1 && clearInterval(timer_id1);
        ws.send('some data...');
    }

    //服务端发来消息时
    function onmessage(e){
    }
</script>
  • zhouciming 2018-10-17

    利用timer重连,确实是一种方案,我目前用的是这种。情况是这样的,原来我的server是继承自Worker的自定义类,客户端通过异步方式连接上来,在onconnect里连接成功后,不会被断开。但是现在用的server是gatewayworker中的Gateway类,客户端在第一次onconnect后,会被gateway close(因为gateway可能未完全启动好),然后客户端再次发起重连,这时连接上后就不会被close了!
    所以想知道gateway的设计是否本来就是这样的!?

  • phpcreeper 2018-10-17

    对于发起异步连接时,确实会存在gateway服务尚未来得及启动而导致连接不上,所以需要客户端重连,但是默认情况下客户端连接是不会被 gateway close掉的,除非gateway设置 $gateway->pingInterval > 0 并且 $gateway->pingNotResponseLimit > 0,这个代表客户端若连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据,则服务端会强行断开链接。

  • zhouciming 2018-10-18

    @614:我这种情况一定不是你说的这种了。因为通过最外层的start.php把gateway和client同时起来的,所以如果gateway未完全启动,而这时客户端就向gateway发起了异步连接请求,我是在onClose中检测到的,所以不知道是不是gateway主动关闭连接,但可以确定的是进来了onClose回调了!所以想来问问为什么会进入onClose?

年代过于久远,无法发表回答
×
🔝