Socket.IO处理断开事件

时间:2013-06-25 00:33:02

标签: javascript socket.io disconnect

无法处理此断开事件,不知道为什么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]应该被删除,但它不是

4 个答案:

答案 0 :(得分:145)

好的,而不是通过名称跟踪识别玩家与他们连接的插座。你可以有像

这样的实现

服务器

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

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

答案 1 :(得分:14)

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

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

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

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

答案 2 :(得分:1)

<key code="51" output="&#x0008;"/> <!-- backspace -->
<key code="53" output="&#x001B;"/> <!-- escape -->

答案 3 :(得分:0)

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

 if [ "${CONFIG_DISABLE_BITCODE}" != "true" ]; then
    if [[ "${SDKVERSION}" == 9.* || "${SDKVERSION}" == [0-9][0-9].* ]]; then
      LOCAL_CONFIG_OPTIONS="${LOCAL_CONFIG_OPTIONS} -fvisibility=hidden"
    fi
  fi