Socket.IO处理断开事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket.IO处理断开事件相关的知识,希望对你有一定的参考价值。

无法处理此断开事件,不知道为什么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);

        });

    });

正如您所看到的,当客户端断开连接时,应该删除数组对象[person_name],但不是

答案

好的,而不是通过名称跟踪识别他们已连接的套接字的玩家。你可以有类似的实现

Server

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

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

另一答案

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

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

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


接受的解决方案在服务器端执行disconnect事件的逻辑,当套接字断开时触发,因此有效。

另一答案
import * as Server from 'socket.io';

const io = Server();
io.listen(3000);

export const connections = new Map();

io.on('connection', function (c) {

  connections.set(c, c);

  c.once('disconnect', function () {
    connections.delete(c);
  });

});

以上是关于Socket.IO处理断开事件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 socket.io 获取原生事件数组?

socket.io:没有触发断开事件

Socket.io 断开事件和相关闭包的垃圾收集

断开连接时销毁socket.io连接

Socket.io断开事件错误地为其他用户触发,然后再次连接

socket io:如何传递参数来断开套接字事件?