在 WebSocket 中服务器重新启动时重新连接客户端

2022-08-30 07:30:21

我正在使用使用PHP5和Chrome浏览器作为客户端的Web套接字。我已经从网站上获取了代码 http://code.google.com/p/phpwebsocket/

我运行服务器,客户端也已连接。我也可以聊天。现在,当我重新启动服务器(通过杀死它并重新启动它)时,客户端会获取断开连接的信息,但在我发送消息时会自动不与服务器重新连接。

如何做到这一点?就像我收到断开连接的信息时,我应该检查它并将其发送到JavaScript以刷新页面或重新连接吗?


答案 1

当服务器重新启动时,Web 套接字连接将关闭,因此将触发 JavaScript 事件。下面是一个尝试每五秒钟重新连接一次的示例。onclose

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);
    };
}

答案 2

Andrew给出的解决方案并不完全有效,因为在失去连接的情况下,服务器可能会发送几个关闭事件。

在这种情况下,您将设置多个设置Timout。Andrew 给出的解决方案可能只有在服务器在五秒前准备就绪时才有效。

然后,基于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 */
 /* ... */
}

推荐