首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WebSocket中重新启动服务器时重新连接客户端

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

Stack Overflow用户
提问于 2010-09-24 00:30:15
回答 5查看 92.3K关注 0票数 104

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

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-23 02:01:46

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

代码语言: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);
    };
}
票数 147
EN

Stack Overflow用户

发布于 2013-12-16 21:59:25

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

在这种情况下,您将设置几个setTimout。Andrew给出的解决方案只有在服务器在5秒内准备就绪的情况下才有效。

然后,基于Andrew solution,reworked,我利用了setInterval将ID附加到window对象(这样它就可以在“任何地方”使用):

代码语言:javascript
复制
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 */
 /* ... */
}
票数 43
EN

Stack Overflow用户

发布于 2017-12-15 06:29:27

无可奉告,但以下内容:

代码语言:javascript
复制
var socket;

const socketMessageListener = (event) => {
  console.log(event.data);
};

const socketOpenListener = (event) => {
  console.log('Connected');
  socket.send('hello');
};

const socketCloseListener = (event) => {
  if (socket) {
    console.error('Disconnected.');
  }
  socket = new WebSocket('ws://localhost:8080');
  socket.addEventListener('open', socketOpenListener);
  socket.addEventListener('message', socketMessageListener);
  socket.addEventListener('close', socketCloseListener);
};

socketCloseListener();

// for testing
setTimeout(()=>{
  socket.close();
},5000);

另外,https://www.npmjs.com/package/back已经足够好了:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3780511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档