সকেট.আইও সংযোগ বিচ্ছিন্ন ইভেন্ট পরিচালনা করছে


90

এই সংযোগ বিচ্ছিন্ন ইভেন্টটি পরিচালনা করতে পারে না, জানেন না কেন সকেট এটির ক্লায়েন্ট / ক্লায়েন্টকে প্রেরণ করে না কেন!

সার্ভার

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'?
শার্লক

4
@ ওপি-র আসল ক্লায়েন্ট কোডটিতে শেরলক তারা একটি কাস্টম ইভেন্ট শোনার চেষ্টা করছে যা তারা সংযোগ বিচ্ছিন্ন যুক্তির জন্য সার্ভারসাইড ট্রিগার করছে। 'সংযোগ বিচ্ছিন্ন' হ'ল প্রকৃত সংযোগ বিচ্ছিন্ন ইভেন্ট, তবে তারা যে সমস্যার সম্মুখীন হচ্ছে তাতে এটি সরাসরি অবদান রাখে না।
জন চার্চ

উত্তর:


173

ঠিক আছে, সকেটের সাহায্যে খেলোয়াড়দের নাম ট্র্যাক করে সনাক্ত করার পরিবর্তে যার মাধ্যমে তারা সংযুক্ত রয়েছে। আপনার মত একটি বাস্তবায়ন থাকতে পারে

সার্ভার

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

আশা করি এটি আপনাকে অন্যভাবে ভাবতে সহায়তা করবে


92
allClients.splice(i, 1)কোনও উপাদান মোছার জন্য আরও ভাল ব্যবহার । delete allClients[i]সবেমাত্র অ্যারে অবস্থানটি সেট করবেundefined
ইয়ভস

4
এটি কেন কাজ করছে তবে তাদের নাম সমাধান সহ লোকেরা ট্র্যাক করছে না?
sha1

এটি আমার জন্য কাজ করছে না। এখানে iপ্রতিবার -1 এর মান পেয়েছে। আপনি কি বলতে পারেন কি চলছে।
বিনিত চৌহান

4
@ ভিনিটচৌহান আপনার সম্ভবত সম্ভবত আপনার আসল সমস্যা নিয়ে আলাদা প্রশ্ন জিজ্ঞাসা করবে।
কোড-জাফ

যখন আপনি -1 এর মান পান, তার অর্থ আপনি একটি সকেটটি বিভক্ত করার চেষ্টা করছেন যা অস্তিত্বহীন (কেউ সংযোগ বিচ্ছিন্ন করে তবে আপনি ব্যক্তিটিকে এখনও আপনার allClientsঅ্যারেতে নিবন্ধিত করেন নি )। আমি আপনাকে কেবল ফিরে আসার পরামর্শ দিচ্ছি: if (i === -1)return;এটি ছড়িয়ে দেওয়ার চেষ্টা করার আগে।
কোয়েন বি

23

@ শ 1 এর মত যারা ভাবছেন যে কেন ওপি কোডটি কাজ করে না -

সার্ভার সাইডে প্লেয়ার মুছে ফেলার জন্য ওপি'র যুক্তি 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);
  });

});

4
এবং একজন একজন প্রবীণ ব্যক্তির কাছ থেকে ব্যাখ্যা এবং মন্তব্য সহ একটি বিস্তারিত উত্তর আশা করতে পারেন, তবে আমি অনুমান করি যে আমাদের কেবল কোডের একগুচ্ছ সাথে নিষ্পত্তি করতে হবে
সেমাল

আপনার যদি প্রশ্ন থাকে তবে আমাকে জানতে দিন, উত্তরটি লিখতে আমি মনে করি না
আলেকজান্ডার মিলস

4
আমি আসলে কোন প্রশ্ন নেই। এটি কেবল একটি লেখকের কাছে গঠনমূলক সমালোচনা ছিল, যিনি মন্তব্যগুলি ব্যবহার করা এবং উত্তরের বিবরণ স্থান দেওয়া আরও ভাল জানেন যে কাউকে ছাড়িয়ে না দিয়ে আপনার উদাহরণটি (কমপক্ষে অন্তত) আপনার উদাহরণটি বুঝতে দেয়। যাইহোক, শুভ নববর্ষ ..
সিমেল

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)
  })
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.