简体   繁体   English

socket.io在刷新时没有断开连接吗?

[英]socket.io isn't disconnecting on refresh?

I am brand new to socket.io and trying to create a sort of mmo using it. 我是socket.io的新手,正在尝试使用它创建某种mmo。 However I've been running into a few issues. 但是,我一直遇到一些问题。 The current one is if someone refreshes it doesn't look like it is disconnecting the previous socket? 当前的一种是,如果有人刷新它,看起来不是在断开先前的套接字? In my console it shows the user as having connected twice and will create another listening for the same user. 在我的控制台中,它显示该用户已连接两次,并将为该用户创建另一个监听。

This is what my console looks like after 3 refreshes: 这是我的控制台在刷新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

client side: 客户端:

  var socket = io();
setUsername();

function setUsername() {
socket.emit('add user', username);
}

socket.on('startMap', function (data) {
socket.emit('getMap');
});

server side: 服务器端:

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");
  });
});

After 11 refreshes for same user: 为同一用户刷新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

you have to listen to the disconnect event in the server side and broadcast accordingly 您必须在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);
    });
});

Check whenever user disconnected. 检查用户何时断开连接。 Then do stuff there, remove from map etc. 然后在那做东西,从地图上删除等等。

 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); }); }); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM