服务端未完全启动时, client连接失败后调用reconnect后,虽然connect成功的,但是发送数据服务端并不能接收到,这是为什么? 在onClose中我应该怎么写才能保证接下来发送数据能成功呢?
给你个样板代码,照猫画虎吧:
<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>
利用timer重连,确实是一种方案,我目前用的是这种。情况是这样的,原来我的server是继承自Worker的自定义类,客户端通过异步方式连接上来,在onconnect里连接成功后,不会被断开。但是现在用的server是gatewayworker中的Gateway类,客户端在第一次onconnect后,会被gateway close(因为gateway可能未完全启动好),然后客户端再次发起重连,这时连接上后就不会被close了! 所以想知道gateway的设计是否本来就是这样的!?
对于发起异步连接时,确实会存在gateway服务尚未来得及启动而导致连接不上,所以需要客户端重连,但是默认情况下客户端连接是不会被 gateway close掉的,除非gateway设置 $gateway->pingInterval > 0 并且 $gateway->pingNotResponseLimit > 0,这个代表客户端若连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据,则服务端会强行断开链接。
@614:我这种情况一定不是你说的这种了。因为通过最外层的start.php把gateway和client同时起来的,所以如果gateway未完全启动,而这时客户端就向gateway发起了异步连接请求,我是在onClose中检测到的,所以不知道是不是gateway主动关闭连接,但可以确定的是进来了onClose回调了!所以想来问问为什么会进入onClose?
给你个样板代码,照猫画虎吧:
利用timer重连,确实是一种方案,我目前用的是这种。情况是这样的,原来我的server是继承自Worker的自定义类,客户端通过异步方式连接上来,在onconnect里连接成功后,不会被断开。但是现在用的server是gatewayworker中的Gateway类,客户端在第一次onconnect后,会被gateway close(因为gateway可能未完全启动好),然后客户端再次发起重连,这时连接上后就不会被close了!
所以想知道gateway的设计是否本来就是这样的!?
对于发起异步连接时,确实会存在gateway服务尚未来得及启动而导致连接不上,所以需要客户端重连,但是默认情况下客户端连接是不会被 gateway close掉的,除非gateway设置 $gateway->pingInterval > 0 并且 $gateway->pingNotResponseLimit > 0,这个代表客户端若连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据,则服务端会强行断开链接。
@614:我这种情况一定不是你说的这种了。因为通过最外层的start.php把gateway和client同时起来的,所以如果gateway未完全启动,而这时客户端就向gateway发起了异步连接请求,我是在onClose中检测到的,所以不知道是不是gateway主动关闭连接,但可以确定的是进来了onClose回调了!所以想来问问为什么会进入onClose?