我注意到,每当我的服务器脱机时,只要我将其切换回在线状态,它都会收到大量的套接字事件,这些事件是在服务器关闭时触发的。(现在已过时的事件)。
在x秒钟未收到响应之后,是否有办法阻止socket.io重新发送事件?
当开源库的所有其他功能都失败时,您可以研究代码并找出可以解决的内容。在花了一些时间使用socket.io源代码执行此操作之后…
问题的症结似乎是这样的代码,这里在socket.emit()
:
if (this.connected) {
this.packet(packet);
} else {
this.sendBuffer.push(packet);
}
如果未连接套接字,则通过发送的所有数据都将.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 = [];
};
因此,这充分解释了为什么它会在连接断开时缓冲所有发送的数据,然后在重新连接时将所有数据发送出去。
现在,关于如何防止它发送缓冲的数据,这是一个理论,我将在今晚晚些时候有更多时间尝试进行测试。
看起来有两件事给他们带来了机会。套接字connect
在发送缓冲的数据之前通知事件,并且sendBuffer
是套接字的公共属性。因此,看起来您可以在客户端代码中执行此操作(在连接时清除缓冲区):
// clear previously buffered data when reconnecting
socket.on('connect', function() {
socket.sendBuffer = [];
});
我刚刚对其进行了测试,并且效果很好。我有一个客户端套接字,它每秒向服务器发送增加的计数器消息。我关闭服务器5秒钟,然后在添加此代码之前将服务器重新启动,所有排队的消息都到达了服务器。没有任何遗漏。
当我在上面添加三行代码时,在服务器关闭时发送的任何消息都不会发送到服务器(从技术上讲,它们在发送之前会从发送缓冲区中清除)。有用。
仅供参考,另一种可能性.emit()
是在未连接套接字时不调用。因此,您可以创建自己的函数或方法,这些函数或方法仅.emit()
在实际连接套接字时才会尝试执行,因此什么也不会进入sendBuffer
。
Socket.prototype.emitWhenConnected = function(msg, data) {
if (this.connected) {
return this.emit(msg, data);
} else {
// do nothing?
return this;
}
}
或者,更危险的是,您可以重写.emit()
以使其以这种方式工作(不是我的建议)。
我有一个调用外部应用程序的Restful服务。这个应用程序使我的服务挂起。因此,当用户调用我的服务时,由于这个外部应用程序,可能需要一个小时。外部应用程序只需几秒钟即可执行。否则,就出了问题。因此,我希望我的服务中的代码最多执行30秒。如果超过30秒,我想停止服务并重新启动它。 以下是我想要的: 我不希望代码每30秒执行一次。我希望能够停止代码执行,并从头重新启动它。 服务内容如下:
我正在用Express开发一个具有聊天功能的多页面web应用程序(由socket.io提供)。用户可以邀请其他人到私人共享聊天室(该聊天室还有其他组件,如共享画板)。我想在完成邀请事务后将两个用户(邀请者和被邀请者)重定向到不同的URL。 因为socket.io不能访问路由的请求和响应对象,所以我尝试将socket.io实例传递到路由处理中。除了重复事件处理程序堆积在页面刷新上的问题之外,Expr
我熟悉python单元测试测试,如果断言失败,该测试将被标记为“失败”,并继续进行其他测试。另一方面,茉莉花将继续通过所有期望,即使其中一个失败。在第一个预期失败后,如何使Jasmine停止处理测试? 我想错了吗?我有一些测试有很多< code>expect,当只有第一个错误时,显示所有的堆栈跟踪似乎是一种浪费。
我如何在x个循环之后暂停我的循环x秒? 我的循环逐行读取IP地址列表。在50个循环之后,它应该暂停x秒,直到循环继续。
问题内容: 请查找每10秒钟重复一次的更新代码。但是,问题在于它每10秒在屏幕上创建一个新的GUI,而不是仅每10秒更新一次数据。请您指教 问题答案: 您只有一门课,Learningfromscrach。在其中,您具有主要功能。在主要功能内,您将创建 另一个 Learningfromscrach 实例 ,该 实例 现在传递给计时器,每10秒运行一次。当它在10秒内运行时,它会创建另一个Learni
当战争部署失败时,我想阻止Tomcat。是否有一些钩子或监听器可以用于此? 我知道,通常情况下,当部署失败时不会让容器停止。在我的例子中,我想使用Tomcat实现一个快速失败的错误模型,因为目前没有机会用带有嵌入式Servlet引擎(例如,Spring-Boot)的胖jar替换WAR。