【发布时间】:2012-03-24 19:53:18
【问题描述】:
问题:在您发出手册.disconnect() 后如何将客户端重新连接到服务器?
在我当前的项目中,当用户从会话中注销时,我需要断开客户端与服务器的连接。我做了一个socket.disconnect() 来成功断开连接。服务器从会话中删除了用户。
一段时间后,用户决定再次登录,但是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()方法。
当用户再次登录时,这个类再次被初始化,但有趣的是套接字以某种方式保留了它之前的所有事件和会话。
/**
* 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 结果:
下面是我的 node.js 调试窗口
我认为这个有趣的场景的根本原因是之前附加的connect 事件监听器没有被彻底删除。我应该如何删除它?我应该使用once 吗?或者我也应该指定监听器函数。我认为removeAllListeners() 足以完成这项任务。
【问题讨论】:
-
你的
register事件意味着login,对吧? -
登录和注册的排序。但是当我在连接回调中执行 console.log 时,我什么也没得到。当这段代码第二次运行时,套接字对象被创建但从不触发连接事件。创建的socket对象有socket.socket.connected false。我看到重新连接方法出现在 socket.socket 但我不确定是否是那个。试过了,它多次调用我的方法..
标签: javascript node.js websocket socket.io