gpt4 book ai didi

javascript - 调用 .disconnect() 后如何重新连接

转载 作者:数据小太阳 更新时间:2023-10-29 04:57:39 27 4
gpt4 key购买 nike

问题:在发出手动 .disconnect() 后如何将客户端重新连接到服务器?

在我当前的项目中,当用户从 session 中注销时,我需要断开客户端与服务器的连接。我执行了 socket.disconnect() 以成功断开连接。服务器从 session 中删除了用户。

一段时间后,用户决定再次登录,但 socket.io 拒绝连接。

我很清楚 Socket.IO 已经实现了重新连接算法,但显然这是不同的情况。

下面是我进行连接的代码片段。在此代码块的第二次触发中,创建了对象 socket,但没有从该对象触发 connect

//Start the socket
var socket = io.connect(SOCKET_IO_URL);
socket.on('connect', function() {
me.fireEvent('connect');
socket.emit('register', {
hashed_identifier: hashed_identifier,
account_id: account_id
});
});

socket.on('ready', function() {
me.ready = true;
me.log('Handshake done. Listening for new data');
});

socket.on('data', function(data) {
me.fireEvent('data', data);
//Tells server we received it
socket.emit('data', {ack: 1});
});

socket.on('disconnect', function() {
me.fireEvent('disconnect');
});

更新:根据@Tony 的要求

事实上整个东西都包裹在 Sencha Touch 2.0 下,但我相信与 ST2.0 无关

这是我的数据类。该类的用法是当用户登录时,该类将被初始化。并且在用户注销时,系统将调用该类中的disconnect()方法。

当用户再次登录时,该类将再次初始化,但有趣的是套接字以某种方式保留了它之前拥有的所有先前事件和 session 。

/**
* Serve as interface to wait for data communication in between server and client
*/
Ext.define('go.module.connect.Data', {

mixins: {
observable: 'Ext.mixin.Observable'
},

config: {
account: null
},

ready: false,

socket: null,

constructor: function(cfg) {
var me = this,
hashed_identifier = Sha1.hash(go.__identifier);


me.initConfig(cfg);

var account_id = me.getAccount().get('id');

//Start the socket
var socket = io.connect(SOCKET_IO_URL);
socket.on('connect', function() {
console.log('connect');
me.fireEvent('connect');
socket.emit('register', {
hashed_identifier:hashed_identifier,
account_id: account_id
});
});

socket.on('ready', function() {
me.ready = true;
me.log('Handshake done. Listening for new data');
});

socket.on('data', function(data) {
me.fireEvent('data', data);
//Tells server we received it
socket.emit('data', {ack: 1});
});

socket.on('disconnect', function() {
me.fireEvent('disconnect');
});

console.log(socket);
if (!socket.socket.connected){
socket.socket.reconnect();
}


me.socket = socket;


me.callParent([cfg]);
},

disconnect: function() {
this.socket.disconnect();
this.socket.removeAllListeners();
this.socket.socket.removeAllListeners();
},

log: function(msg) {
console.log('@@ Connect: '+msg);
}
});

下面是我的 console.log 结果:

Console screenshot

下面是我的 node.js 调试窗口

Node.js debug window

我相信这个有趣的场景的根本原因是之前附加的 connect 事件监听器没有彻底删除。我应该如何删除它?我应该使用一次吗?或者我也应该指定监听器函数。我认为 removeAllListeners() 足以完成这项任务。

最佳答案

最新的 socket.io 中的标准方法是:

socket.on('disconnect', function() {
socket.socket.reconnect();
})

这是我一直在我的应用程序中使用的,效果很好。它还确保套接字在服务器出现故障时继续尝试重新连接,并最终在服务器重新联机时重新连接。

在您的情况下,您需要确保两件事:

  1. 您只需创建一次套接字。不要多次调用 socket = io.connect(...)
  2. 您只需设置一次事件处理 - 否则它们将被触发多次!

所以当你想重新连接客户端时,调用socket.socket.reconnect()。您还可以从 FireFox 和 Chrome 中的浏览器控制台对此进行测试。

关于javascript - 调用 .disconnect() 后如何重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9598900/

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