首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Socket.IO处理断开连接事件

Socket.IO处理断开连接事件
EN

Stack Overflow用户
提问于 2013-06-25 08:33:02
回答 3查看 208.4K关注 0票数 101

无法处理此disconnect事件,不知道为什么套接字未发送到客户端/客户端没有响应!

服务器

代码语言:javascript
复制
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;

  });

});

客户端

代码语言:javascript
复制
 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);

        });

    });

正如您所看到的,当客户端断开连接时,应该删除阵列objectperson_name,但事实并非如此。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-26 12:41:07

好的,不是通过名字来识别玩家,而是跟踪他们所连接的套接字。你可以有这样的实现

服务器

代码语言:javascript
复制
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);
   });
});

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

票数 189
EN

Stack Overflow用户

发布于 2018-04-25 08:47:19

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

代码语言:javascript
复制
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);
  });

});
票数 8
EN

Stack Overflow用户

发布于 2019-12-22 22:56:56

如果你愿意,你也可以像这样使用socket id来管理你的播放器列表。

代码语言:javascript
复制
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)
  })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17287330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档