【问题标题】:Socket.IO handling disconnect eventSocket.IO 处理断开事件
【发布时间】:2013-06-21 15:49:51
【问题描述】:

无法处理这个断开连接事件,不知道为什么socket没有发送到客户端/客户端没有响应!

服务器

io.sockets.on('connection', function (socket) {

  socket.on('NewPlayer', function(data1) {

    online = online + 1;
    console.log('Online players : ' + online);
    console.log('New player connected : ' + data1);
    Players[data1] = data1;
    console.log(Players);

  });

  socket.on('DelPlayer', function(data) {

    delete Players[data];
    console.log(Players);
    console.log('Adios' + data);

  });

  socket.on('disconnect', function () {

      socket.emit('disconnected');
      online = online - 1;

  });

});

客户

 var socket = io.connect('http://localhost');

    socket.on('connect', function () { 

        person_name = prompt("Welcome. Please enter your name");

        socket.emit('NewPlayer', person_name);

        socket.on('disconnected', function() {

            socket.emit('DelPlayer', person_name);

        });

    });

如您所见,当客户端断开连接时,应该删除 Array 对象[person_name],但事实并非如此。

【问题讨论】:

  • 你最好换个方式试试,先删除播放器再断开连接。因为一旦您与服务器断开连接,服务器将无法接收客户端发出的事件。跟踪套接字而不是播放器,通过它您可以轻松移除播放器。
  • 我应该如何删除播放器然后断开连接?我怎么知道播放器何时会断开连接?。
  • 客户端上的事件不应该是'disconnect' 而不是'disconnected' 吗?
  • @Sherlock 在 OP 的原始客户端代码中,他们试图侦听自定义事件,他们正在触发服务器端的断开逻辑。 “断开连接”确实是内置的断开连接事件,但它不会直接导致他们遇到的问题。

标签: javascript socket.io disconnect


【解决方案1】:

好的,而不是通过他们连接的套接字通过名称轨道来识别玩家。你可以有一个像

服务器

var allClients = [];
io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function() {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      allClients.splice(i, 1);
   });
});

希望这会帮助您以另一种方式思考

【讨论】:

  • 最好使用allClients.splice(i, 1) 删除元素。 delete allClients[i] 只会将数组位置设置为 undefined
  • 为什么它起作用了,但是用他们的名字跟踪人的解决方案不起作用?
  • 这对我不起作用。这里i 每次都得到 -1 的值。你能告诉我发生了什么事吗?
  • @VinitChouhan 您可能应该针对您的实际问题提出单独的问题。
  • 当你得到 -1 的值时,这意味着你正在尝试拼接一个不存在的套接字(有人断开连接但你还没有在你的 allClients 数组中注册这个人)。我建议你在尝试拼接之前返回:if (i === -1)return;
【解决方案2】:

对于像@sha1 这样想知道为什么 OP 的代码不起作用的人 -

OP 在服务器端删除播放器的逻辑在DelPlayer 事件的处理程序中, 并且发出此事件的代码(DelPlayer)在客户端的disconnected 事件回调中。

发出此disconnected 事件的服务器端代码位于disconnect 事件回调中,该回调在套接字断开连接时触发。由于套接字已经失去连接,disconnected 事件不会到达客户端。


接受的解决方案在服务器端执行disconnect 事件的逻辑,当套接字断开连接时触发该事件,因此可以工作。

【讨论】:

    【解决方案3】:

    创建一个 Map 或一个 Set,并使用“on connection”事件为它设置每个连接的套接字,相反的“once disconnect”事件从我们之前创建的 Map 中删除该套接字

    import * as Server from 'socket.io';
    
    const io = Server();
    io.listen(3000);
    
    const connections = new Set();
    
    io.on('connection', function (s) {
    
      connections.add(s);
    
      s.once('disconnect', function () {
        connections.delete(s);
      });
    
    });
    

    【讨论】:

      【解决方案4】:

      如果您喜欢这样使用套接字 id 来管理您的播放器列表,您也可以。

      io.on('connection', function(socket){
        socket.on('disconnect', function() {
          console.log("disconnect")
          for(var i = 0; i < onlineplayers.length; i++ ){
            if(onlineplayers[i].socket === socket.id){
              console.log(onlineplayers[i].code + " just disconnected")
              onlineplayers.splice(i, 1)
            }
          }
          io.emit('players', onlineplayers)
        })
      
        socket.on('lobby_join', function(player) {
          if(player.available === false) return
          var exists = false
          for(var i = 0; i < onlineplayers.length; i++ ){
            if(onlineplayers[i].code === player.code){
              exists = true
            }
          }
          if(exists === false){
            onlineplayers.push({
              code: player.code,
              socket:socket.id
            })
          }
          io.emit('players', onlineplayers)
        })
      
        socket.on('lobby_leave', function(player) {
          var exists = false
          for(var i = 0; i < onlineplayers.length; i++ ){
            if(onlineplayers[i].code === player.code){
              onlineplayers.splice(i, 1)
            }
          }
          io.emit('players', onlineplayers)
        })
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-24
        • 2015-04-30
        • 1970-01-01
        • 2012-05-07
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多