当服务器脱机时,socket.io发射

我正在使用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/最初是closures的,并试图调用几个sendMessage() – (约10个电话)

正如预期在浏览器中,我将得到控制台日志中的握手错误。

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

但令人惊讶的是,一旦握手build立,在离线状态下发送的所有消息都将被捕获到服务器中。

我的问题:1)这是离线逻辑作为socket.io或WebSocket规范的一部分? 2)我search了很多离线模式的socket.io问题,并且看到了一些特殊的处理build议来捕获离线消息。 但是如果没有这些特殊的离线检查,这是如何工

是的,在第一次连接之前有一个“离线”的缓冲区,在这里可以看到socket.js的实现:

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

(尤其是检查onconnect和emitBuffered函数/ attribs)

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

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

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