Socket.IO हैंडल डिस्कनेक्ट घटना


88

खिचड़ी भाषा इस डिस्कनेक्ट घटना को संभालती है, न जाने क्यों सॉकेट इसके क्लाइंट / क्लाइंट को नहीं भेजता है!

सर्वर

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
'disconnect'इसके बजाय ग्राहक पर होने वाली घटना नहीं होनी चाहिए 'disconnected'?
शर्लक

1
ओपी के मूल ग्राहक कोड में @Sherlock वे एक कस्टम इवेंट को सुनने का प्रयास कर रहे थे जो डिस्कनेक्ट किए गए तर्क के लिए सर्वरगाइड को ट्रिगर कर रहे थे। 'डिस्कनेक्ट' वास्तव में डिस्कनेक्ट इवेंट में बनाया गया है, लेकिन यह उस मुद्दे पर सीधे योगदान नहीं करता है जो वे अनुभव कर रहे हैं।
जॉन चर्च

जवाबों:


168

ओके, सॉकेट्स के साथ नाम ट्रैक द्वारा खिलाड़ियों की पहचान करने के बजाय जिसके माध्यम से वे जुड़े हुए हैं। आपके पास एक कार्यान्वयन हो सकता है जैसे

सर्वर

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

आशा है कि यह आपको दूसरे तरीके से सोचने में मदद करेगा


90
allClients.splice(i, 1)किसी तत्व को हटाने के लिए बेहतर उपयोग । delete allClients[i]बस के लिए सरणी स्थिति सेट हो जाएगाundefined
यवेस

1
यह क्यों काम कर रहा है, लेकिन उनके नाम समाधान वाले ट्रैकिंग लोग काम नहीं कर रहे हैं?
शा 1

यह मेरे लिए काम नहीं कर रहा है। यहां iहर बार -1 का मान मिला। क्या आप बता सकते हैं कि क्या चल रहा है।
विनीत चौहान

1
@VinitChouhan आपको अपने वास्तविक मुद्दे के साथ शायद अलग सवाल पूछना चाहिए।
कोड-जफ

जब आप -1 का मान प्राप्त करते हैं, तो इसका मतलब है कि आप एक सॉकेट को विभाजित करने की कोशिश कर रहे हैं जो मौजूद नहीं है (कोई व्यक्ति डिस्कनेक्ट करता है लेकिन आपने उस व्यक्ति को अभी तक अपने allClientsसरणी में पंजीकृत नहीं किया है )। मेरा सुझाव है कि आप अभी वापसी करें: if (i === -1)return;इसे अलग करने की कोशिश करने से पहले।
कोएन बी।

23

@ Sha1 जैसे लोगों के लिए है कि ओपी कोड काम क्यों नहीं करता है -

सर्वर साइड पर प्लेयर को हटाने के लिए ओपी का तर्क DelPlayerईवेंट के लिए हैंडलर में है , और कोड जो इस ईवेंट ( DelPlayer) का उत्सर्जन करता है, disconnectedवह क्लाइंट के ईवेंट कॉलबैक में है।

सर्वर साइड कोड जो इस disconnectedईवेंट का उत्सर्जन करता है, वह disconnectईवेंट कॉलबैक के अंदर होता है जिसे सॉकेट कनेक्शन खो देने पर निकाल दिया जाता है। चूंकि सॉकेट पहले ही कनेक्शन खो चुका है, इसलिए disconnectedघटना क्लाइंट तक नहीं पहुंचती है।


स्वीकृत समाधान disconnectसर्वर साइड में घटना पर तर्क को निष्पादित करता है , जिसे सॉकेट डिस्कनेक्ट होने पर निकाल दिया जाता है, इसलिए काम करता है।


6

एक मैप या एक सेट बनाएँ, और "कनेक्शन पर" ईवेंट का उपयोग करके इसे प्रत्येक कनेक्ट किए गए सॉकेट पर सेट करें, उल्टे "एक बार डिस्कनेक्ट करें" ईवेंट उस मानचित्र से सॉकेट को हटा दें जिसे हमने पहले बनाया था।

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

});

1
और किसी को एक अनुभवी से स्पष्टीकरण और टिप्पणियों के साथ एक विस्तृत जवाब की उम्मीद होगी, लेकिन मुझे लगता है कि हमें कोड का एक गुच्छा के साथ बसना होगा
Cemal

मुझे बताएं कि क्या आपके कोई प्रश्न हैं, मुझे जवाब लिखना याद नहीं है
अलेक्जेंडर मिल्स

1
मेरे पास वास्तव में कोई सवाल नहीं है। यह सिर्फ एक लेखक के लिए एक रचनात्मक आलोचना थी, जो किसी को (अच्छी तरह से कम से कम) किसी को अपने उदाहरण के बिना समझने के लिए आपको जवाब देने के लिए टिप्पणियों और जगह के विवरण का उपयोग करना बेहतर जानता है। वैसे भी, नया साल मुबारक हो ..
Cemal

0

आप भी कर सकते हैं, अगर आपको अपनी प्लेयर सूची को इस तरह प्रबंधित करने के लिए सॉकेट आईडी का उपयोग करना पसंद है।

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)
  })
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.