Rai*_*mer 6 javascript websocket node.js socket.io
我注意到,只要我的服务器处于脱机状态,并且我将其重新联机,就会收到大量的套接字事件,这些事件在服务器关闭时被触发.(现在已经过时的事件).
有没有办法阻止socket.io在没有收到x秒的响应后重新发出事件?
jfr*_*d00 23
当所有其他方法都失败了开源库时,你去研究代码,看看你能弄清楚什么.花了一些时间用socket.io源代码做...
问题的症结似乎是这样的代码,这里在socket.emit():
if (this.connected) {
this.packet(packet);
} else {
this.sendBuffer.push(packet);
}
Run Code Online (Sandbox Code Playgroud)
如果未连接套接字,则通过.emit()缓存发送的所有数据都将被缓存sendBuffer.然后,当套接字再次连接时,我们看到:
Socket.prototype.onconnect = function(){
this.connected = true;
this.disconnected = false;
this.emit('connect');
this.emitBuffered();
};
Socket.prototype.emitBuffered = function(){
var i;
for (i = 0; i < this.receiveBuffer.length; i++) {
emit.apply(this, this.receiveBuffer[i]);
}
this.receiveBuffer = [];
for (i = 0; i < this.sendBuffer.length; i++) {
this.packet(this.sendBuffer[i]);
}
this.sendBuffer = [];
};
Run Code Online (Sandbox Code Playgroud)
因此,这完全解释了为什么它会在连接断开时缓冲所有发送的数据,然后在重新连接时发送所有数据.
现在,关于如何防止它发送这个缓冲数据,这是一个理论,我将在今晚稍后测试,当我有更多的时间.
两件事看起来像是一个机会.套接字connect在发送缓冲数据之前通知事件,并且sendBuffer是套接字的公共属性.所以,看起来你可以在客户端代码中执行此操作(在连接时清除缓冲区):
// clear previously buffered data when reconnecting
socket.on('connect', function() {
socket.sendBuffer = [];
});
Run Code Online (Sandbox Code Playgroud)
我刚试过它,它运行得很好.我有一个客户端套接字,每秒向服务器发送一个增加的计数器消息.我将服务器关闭5秒钟,然后当我在添加此代码之前重新启动服务器时,所有排队的消息都会到达服务器上.没有错过任何计数.
然后,当我添加上面三行代码时,服务器关闭时发送的任何消息都不会发送到服务器(从技术上讲,它们在发送之前从发送缓冲区中清除).有用.
仅供参考,另一种可能性.emit()是在未连接套接字时不调用.所以,你可以创建自己的函数或方法,只有.emit()在套接字实际连接时才会尝试,因此什么都不会进入sendBuffer.
Socket.prototype.emitWhenConnected = function(msg, data) {
if (this.connected) {
return this.emit(msg, data);
} else {
// do nothing?
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,更危险的是,您可以覆盖.emit()以使其以这种方式工作(不是我的建议).
| 归档时间: |
|
| 查看次数: |
2751 次 |
| 最近记录: |