【问题标题】:socket.io emit when server is offline当服务器离线时 socket.io 发出
【发布时间】:2015-09-15 06:39:15
【问题描述】:

我正在使用 socket.io v1.3.6 (nodejs) 并尝试使用以下代码从浏览器发出数据。

客户端代码

var socket = io.connect('http://something.com:3300/');
function sendMessage(message) {
	socket.emit('message', message);    
}

服务器代码

var io = require('socket.io').listen(3300);

io.sockets.on('connection', function (socket) {
  messageHandler(socket);
});

function messageHandler(socket) {
    socket.on('message', function (data) {	
	  console.log('Captured a message : ' + data);	
    });
}

我的套接字服务器 http://something.com:3300/ 最初已关闭,并尝试调用几个 sendMessage() - (比如大约 10 个调用)

在浏览器中,我会在控制台日志中收到握手错误。

我等了 5 分钟,然后启动了套接字服务器。

但令人惊讶的是,一旦建立握手,离线期间发送的所有消息都会在服务器中捕获。

我的问题: 1) 这个离线逻辑是 socket.io 或 WebSocket 规范的一部分吗? 2)我搜索了很多离线模式socket.io的问题,看到一些特殊的处理建议来捕获离线消息。但是,如果没有这些特殊的离线检查,这将如何运作呢?

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    是的,在第一次连接之前发出的包有一个“离线”缓冲,请参阅此处自己的 socket.js 实现:

    https://github.com/socketio/socket.io-client/blob/master/lib/socket.js

    (特别是检查 onconnect 和 emitBuffered 函数/属性)

    【讨论】:

    • 谢谢你解释得很好!当 onconnect 时,它会发出 emitBuffers 中的所有数据...只要浏览器保持打开状态,它就会变得可靠。
    • 那么,您能接受我的回答吗?我很乐意提供帮助:)
    【解决方案2】:

    我通过重新连接的这个小改动解决了这个问题:

    mySocket.on('reconnect', function() {
    
      //Avoid that buffered emits getting send again
      mySocket.sendBuffer=[];
    
      ...
    });
    

    通过将 sendBuffer 设置为空数组,您可以避免在重新连接时再次发送包。当然,您应该自己处理发送尝试。

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 2013-08-17
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      相关资源
      最近更新 更多