【问题标题】:socket.io isn't disconnecting on refresh?socket.io 在刷新时没有断开连接?
【发布时间】: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


【解决方案1】:

您必须在server side 中收听disconnect 事件并进行相应的广播

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(){
        // your action on user disconnect
      socket.broadcast.to(socket.chatroom).emit('user disconnect', name);
    });
});

【讨论】:

  • socket.on('disconnect', function(){ console.log("user has disconnected"); socket.disconnect(); }) 这个我已经有了,是一样还是不一样?
  • 你的代码在哪里?我什么都没看到。
  • 抱歉还有一堆代码,我正试图把它剪掉,补充一下它的位置。
【解决方案2】:

在用户断开连接时检查。然后在那里做一些事情,从地图中移除等等。

let users = new Object(); // Store users
io.on('connection', function(socket) {
  socket.on('disconnect', function() {
    console.log("User has disconnected: " + users[socket.id])
    delete users[socket.id]; // User disconnected, delete from list
  });

  socket.on('add user', function(username) {
    users[socket.id] = username; // Add user to list
    console.log("User has joined: " + username);
  });
});

【讨论】:

  • 我已经有一个断开连接事件 socket.on('disconnect', function(){ console.log("user has disconnected"); socket.disconnect(); });但我会尝试你的方式,看看它是否能解决任何问题。谢谢!
  • 在记录连接/断开连接时尝试socket.id。你会发现它们每次都不一样。
  • 尽管它说一旦我刷新 11 次,我的每个套接字等都有 11 个事件侦听器,有时会挂起。这是正常行为吗?
  • socket.disconnect(); 删除它。
  • 在那之后仍然做同样的事情。
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多