【发布时间】:2018-01-01 17:50:48
【问题描述】:
我是 socket.io 的新手,并试图使用它创建一种 mmo。但是我遇到了一些问题。当前一个是如果有人刷新它看起来不像是在断开前一个套接字?在我的控制台中,它显示用户已连接两次,并将为同一用户创建另一个监听。
这是我的控制台在 3 次刷新后的样子:
User has joined : a
in getMap fora
user has disconnected
User has joined : a
User has joined : a
in getMap fora
in getMap fora
in getMap fora
in getMap fora
user has disconnected
user has disconnected
User has joined : a
User has joined : a
User has joined : a
客户端:
var socket = io();
setUsername();
function setUsername() {
socket.emit('add user', username);
}
socket.on('startMap', function (data) {
socket.emit('getMap');
});
服务器端:
io.on('connection', function (socket) {
var addedUser = false;
socket.on('add user', function (username) {
if (addedUser) return;
// we store the username in the socket session for this client
socket.username = username;
addedUser = true;
console.log("User has joined : " + socket.username)
socket.emit('startMap',{username:socket.username});
});//end add user
socket.on('getMap', function(){
console.log("in getMap for" + socket.username);
});
socket.on('disconnect', function(){
console.log("user has disconnected");
});
});
同一用户刷新 11 次后:
(node:8808) Warning: Possible EventEmitter memory leak detected. 11 disconnect listeners added. Use emitter.setMaxListeners() to increase limit
(node:8808) Warning: Possible EventEmitter memory leak detected. 11 add user listeners added. Use emitter.setMaxListeners() to increase limit
(node:8808) Warning: Possible EventEmitter memory leak detected. 11 getMap listeners added. Use emitter.setMaxListeners() to increase limit
(node:8808) Warning: Possible EventEmitter memory leak detected. 11 updateMap listeners added. Use emitter.setMaxListeners() to increase limit
【问题讨论】:
-
你也要广播断开连接事件
-
这显然不是所有相关代码,因为您显示的代码与您显示的 EventEmitter 消息不匹配。浏览器最终会在刷新后释放所有旧的 webSocket。如果他们不立即关闭,他们很快就会关闭。如果他们不这样做,那将是一个糟糕的浏览器错误。
-
是的,我发布后不久就意识到,因为我所有的套接字处理都在路由器内部。每次刷新都会导致这种情况发生。不得不对我的代码进行大量重组,但现在可以正常工作了!
标签: javascript node.js socket.io