簡體   English   中英

Socket.IO 處理斷開事件

[英]Socket.IO handling disconnect event

無法處理這個斷開連接事件,不知道為什么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 object[person_name],但事實並非如此。

好的,而不是通過名稱來識別玩家,而是通過他們連接的套接字來跟蹤。 你可以有一個像

服務器

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事件的邏輯,當套接字斷開連接時會觸發該邏輯,因此可以工作。

創建一個 Map 或一個 Set,並使用“on connection”事件設置給每個連接的套接字,反向“一旦斷開”事件從我們之前創建的 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);
  });

});

你也可以,如果你喜歡使用套接字 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)
  })
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM