ami*_*mit 7 javascript node.js socket.io
我正在尝试学习节点并开始使用socket.io创建mashup.消息传输已经开始但我遇到了一些麻烦.
消息事件多次触发,导致单个消息在收件人的框中多次出现.我已经将套接字路由到exports.chat并且想知道是否导致问题?
缩小问题的范围:消息的触发次数=客户端的连接顺序.也就是说,如果客户端连接第二个,他的消息将触发两次.连接第三个的客户三次.
这是代码片段:
exports.chat = function(io, pseudoArray, req, res){
res.render('chat', {title: 'ChatPanel.'});
var users = 0;
io.sockets.on('connection', function (socket) { // First connection
users += 1;
// reloadUsers(io, users);
socket.on('message', function (data) { // Broadcast the message to all
if(pseudoSet(socket)) {
var transmit = {date : new Date().toISOString(), pseudo : returnPseudo(socket), message : data};
socket.broadcast.emit('message', transmit);
console.log("user "+ transmit['pseudo'] +" said \""+data+"\"");
}
});
socket.set('pseudo', req.session.user, function(){
pseudoArray.push(req.session.user);
socket.emit('pseudoStatus', 'ok');
console.log("user " + req.session.user + " connected");
});
socket.on('disconnect', function () { // Disconnection of the client
users -= 1;
// reloadUsers();
if (pseudoSet(socket)) {
var pseudo;
socket.get('pseudo', function(err, name) {
pseudo = name;
});
var index = pseudoArray.indexOf(pseudo);
pseudo.slice(index - 1, 1);
}
});
});
};
Run Code Online (Sandbox Code Playgroud)
socket.io代码的整个部分必须在external.chat函数之外.套接字IO必须与http/app服务器绑定,您不应在每个请求中处理它.
消息的触发次数=客户端的连接顺序
本质上发生的是,每次新请求到达时,您都在为消息注册事件处理程序,因此它会被触发聊天URL的次数.
io.socket.on('message', function (data) {...})
Run Code Online (Sandbox Code Playgroud)
所以我遇到了同样的问题。解决方案是关闭 socket.on('disconnect') 事件上的所有侦听器,这就是我的代码的样子 -
socket.on('disconnect', function () {
socket.removeAllListeners('send message');
socket.removeAllListeners('disconnect');
io.removeAllListeners('connection');
});
Run Code Online (Sandbox Code Playgroud)
可能不需要在断开连接时调用它,不确定但我还是这样做了。
| 归档时间: |
|
| 查看次数: |
12909 次 |
| 最近记录: |