【发布时间】:2016-01-05 08:48:33
【问题描述】:
我决定从简单的聊天开始。其实有问题。 所以,我有一个对象 ChatServer,它实现了创建 socket.io 的对象,并与连接和断开客户端一起工作。
"use strict";
var SocketServer = require('socket.io')
, Client = require('./Client.js');
class ChatServer {
constructor(app, http) {
var io = SocketServer(http)
, clients = {};
io.on('connection', function(socket) {
console.log('Client ' + socket.id + ' connected');
clients[socket.id] = new Client(app, socket);
socket.on('disconnect', function() {
console.log('Client ' + socket.id + ' disconnected');
clients[socket.id] = undefined;
delete clients[socket.id];
});
});
}
}
module.exports = ChatServer;
当连接客户端对象时,会为这个特定的客户端创建客户端,实现消息处理。
"use strict";
class Client {
constructor(app, socket) {
this.app = app;
this.socket = socket;
this.app.on('chat.sendMessage', this.sendMessage.bind(this));
}
sendMessage(message) {
console.log('Client ' + this.socket.id + ' on chat.sendMessage');
this.socket.emit('chat.sendMessage', message);
}
}
module.exports = Client;
app - 它是 EventEmitter,来自它定期发布“chat.sendMessage”(用于测试),在客户端对象中,消息被接收并发送到浏览器。
但是,如果客户端断开连接,客户端对象并没有消失,而是继续捕获消息并发送到断开连接的套接字。
Client ZbEFj8ykXba9CxLiAAAA connected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA disconnected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
我可能不完全理解销毁对象的机制,我知道它需要删除对它的所有引用,就在这里完成。
clients[socket.id] = undefined;
delete clients[socket.id];
但是,这不起作用。我做错了什么?
【问题讨论】:
标签: javascript node.js socket.io