gpt4 book ai didi

javascript - socket.io:断开连接事件 - 'transport close'、 'client namespace disconnect'、 'transport error' 和 'forced close'

转载 作者:IT老高 更新时间:2023-10-28 23:21:59 30 4
gpt4 key购买 nike

使用 socket.io v1.2.1(仅使用“轮询”传输),有时我的客户会遇到断开连接。

大约 50% 的时间我在断开连接事件回调函数中得到 ping timeout,这是合理的。

其他时候,我得到 transport closeclient namespace disconnecttransport errorforced close。我在文档中没有找到任何关于这些断开连接原因的引用,并且无法从代码中真正理解它们的含义。

我想确保以最佳方式处理每次断开连接(并可能阻止它们)。

也许有人可以解释一下这些原因。

最佳答案

没有文档,这或多或少是我可以从代码中解释的:

强制关闭 - 套接字处于关闭状态

Forced close - https://github.com/socketio/engine.io/blob/master/lib/socket.js

function onPacket(packet){
if ('ping' == packet.type && 'probe' == packet.data) {
transport.send([{ type: 'pong', data: 'probe' }]);
self.emit('upgrading', transport);
clearInterval(self.checkIntervalTimer);
self.checkIntervalTimer = setInterval(check, 100);
} else if ('upgrade' == packet.type && self.readyState != 'closed') {
debug('got upgrade packet - upgrading');
cleanup();
self.upgraded = true;
self.clearTransport();
self.setTransport(transport);
self.emit('upgrade', transport);
self.setPingTimeout();
self.flush();
if (self.readyState == 'closing') {
transport.close(function () {
self.onClose('forced close');
});
}
} else {
cleanup();
transport.close();
}
}


Socket.prototype.close = function () {
if ('open' != this.readyState) return;

this.readyState = 'closing';

if (this.writeBuffer.length) {
this.once('drain', this.closeTransport.bind(this));
return;
}

this.closeTransport();
};

关闭的交通工具(这里没有理由)

Transport close - https://github.com/socketio/engine.io/blob/master/lib/socket.js

 function cleanup() {
self.upgrading = false;

clearInterval(self.checkIntervalTimer);
self.checkIntervalTimer = null;

clearTimeout(self.upgradeTimeoutTimer);
self.upgradeTimeoutTimer = null;

transport.removeListener('packet', onPacket);
transport.removeListener('close', onTransportClose);
transport.removeListener('error', onError);
self.removeListener('close', onClose);
}


function onTransportClose(){
onError("transport closed");
}

我们得到一个客户端断开数据包,所以我们将套接字状态更改为“关闭”

Client namespace disconnect - https://github.com/socketio/socket.io/blob/master/lib/socket.js

Socket.prototype.onpacket = function(packet){
debug('got packet %j', packet);
switch (packet.type) {
case parser.EVENT:
this.onevent(packet);
break;

case parser.BINARY_EVENT:
this.onevent(packet);
break;

case parser.ACK:
this.onack(packet);
break;

case parser.BINARY_ACK:
this.onack(packet);
break;

case parser.DISCONNECT:
this.ondisconnect();
break;

case parser.ERROR:
this.emit('error', packet.data);
}
};


Socket.prototype.ondisconnect = function(){
debug('got disconnect packet');
this.onclose('client namespace disconnect');
};

运输关闭的原因之一

Transport error - https://github.com/socketio/engine.io/blob/master/lib/socket.js

/**
* Called upon transport error.
*
* @param {Error} error object
* @api private
*/

Socket.prototype.onError = function (err) {
debug('transport error');
this.onClose('transport error', err);
};

https://github.com/socketio/engine.io/blob/master/lib/transport.js

/**
* Called with a transport error.
*
* @param {String} message error
* @param {Object} error description
* @api private
*/

Transport.prototype.onError = function (msg, desc) {
if (this.listeners('error').length) {
var err = new Error(msg);
err.type = 'TransportError';
err.description = desc;
this.emit('error', err);
} else {
debug('ignored transport error %s (%s)', msg, desc);
}
};

似乎他们从任何地方向套接字抛出错误,因此找到原因的唯一方法是阅读错误描述(信息不要太多)或查看他们所有的库以找出导致错误的原因。

PD:有很多错误。

关于javascript - socket.io:断开连接事件 - 'transport close'、 'client namespace disconnect'、 'transport error' 和 'forced close',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29073746/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com