栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

x秒/首次尝试失败的响应后,socket.io停止重新发射事件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 reconnectingsocket.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()
以使其以这种方式工作(不是我的建议)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号