我使用PHP5和Chrome浏览器作为客户端使用Web套接字.我从网站http://code.google.com/p/phpwebsocket/上获取了代码.
我运行服务器,客户端也连接.我也可以聊天.现在,当我重新启动服务器(通过杀死它并再次启动它)时,客户端获取断开连接的信息,但在发送消息时自动不会重新连接服务器.
怎么做到这一点?就像我收到断开连接的信息一样,我应该检查它并将其发送到JavaScript以刷新页面或重新连接吗?
And*_*rew 135
当服务器重新启动时,Web Socket连接将关闭,因此onclose会触发JavaScript 事件.这是一个尝试每五秒重新连接的示例.
function start(websocketServerLocation){
    ws = new WebSocket(websocketServerLocation);
    ws.onmessage = function(evt) { alert('message received'); };
    ws.onclose = function(){
        // Try to reconnect in 5 seconds
        setTimeout(function(){start(websocketServerLocation)}, 5000);
    };
}
use*_*737 38
安德鲁给出的解决方案并不完美,因为如果连接丢失,服务器可能会发送几个关闭事件.
在这种情况下,您将设置几个setTimout.安德鲁给出的解决方案可能仅在服务器在五秒钟之前就绪时才有效.
然后,基于Andrew解决方案,重新设计,我已经使用setInterval将ID附加到窗口对象(这样它可以"无处不在"):
var timerID=0;
var socket;
/* Initiate what has to be done */
socket.onopen=function(event){
 /* As what was before */
 if(window.timerID){ /* a setInterval has been fired */
   window.clearInterval(window.timerID);
   window.timerID=0;
 }
 /* ... */
}
socket.onclose=function(event){
  /* ... */
 if(!window.timerID){ /* Avoid firing a new setInterval, after one has been done */
  window.timerID=setInterval(function(){start(websocketServerLocation)}, 5000);
 }
 /* That way, setInterval will be fired only once after losing connection */
 /* ... */
}
Joë*_*nde 31
GitHub托管一个小的JavaScript库,它装饰WebSocket API以提供WebSocket连接,如果连接断开,它将自动重新连接.
使用gzip压缩的缩小库少于600个字节.
官方存储库可在此处获得:
https://github.com/joewalnes/reconnecting-websocket
如果重新启动时有大量客户端连接到服务器.通过使用指数退避算法来管理客户端的重新连接时序可能是值得的.
该算法的工作方式如下:
参考:
http://blog.johnryding.com/post/78544969349/how-to-reconnect-web-sockets-in-a-realtime-web-app
重新连接WebSocket不会使用此算法处理重新连接.
com*_*tic 28
我一直在使用这个patten一段时间用于纯粹的vanilla JavaScript,并且它比其他答案支持更多的情况.
document.addEventListener("DOMContentLoaded", function() {
  'use strict';
  var ws = null;
  function start(){
    ws = new WebSocket("ws://localhost/");
    ws.onopen = function(){
      console.log('connected!');
    };
    ws.onmessage = function(e){
      console.log(e.data);
    };
    ws.onclose = function(){
      console.log('closed!');
      //reconnect now
      check();
    };
  }
  function check(){
    if(!ws || ws.readyState == 3) start();
  }
  start();
  setInterval(check, 5000);
});
一旦服务器关闭连接,这将重试,它将检查连接以确保它每5秒钟也会启动.
因此,如果服务器在运行时或在onclose事件发生时未启动,则一旦重新联机,连接仍将返回.
注意:使用此脚本将不允许您停止尝试打开连接...但我认为这是您想要的?
| 归档时间: | 
 | 
| 查看次数: | 69210 次 | 
| 最近记录: |