socket.io এবং নোডেজ দিয়ে ক্লায়েন্টকে সার্ভার থেকে সংযোগ বিচ্ছিন্ন করতে বাধ্য করুন


117

সকেটআইওর সাথে কোনও ক্লায়েন্টকে সংযোগ বিচ্ছিন্ন করার এবং আক্ষরিকভাবে সংযোগটি বন্ধ করার কোনও উপায় আছে কি? সুতরাং যদি কেউ আমার সার্ভারের সাথে সংযুক্ত থাকে, এবং আমি তাদের এবং আমার সার্ভারের মধ্যে সংযোগটি বন্ধ করতে চাই, তবে আমি কীভাবে তা করব?

উত্তর:


145

সম্পাদনা: এটি এখন সম্ভব

আপনি এখন কেবল socket.disconnect()সার্ভারের দিকে কল করতে পারেন ।

আমার মূল উত্তর:

এটি এখনও সম্ভব নয়।

আপনারও যদি এটির প্রয়োজন হয় তবে এই বিষয়ে ভোট / মন্তব্য করুন ।


সুতরাং আমি এটি করছি, এবং এটি ক্লায়েন্টকে সংযোগ বিচ্ছিন্ন করতে বাধ্য করে, দুর্ভাগ্যক্রমে এটি প্রদর্শিত হয় যে ক্লায়েন্টটি কেবল তত্ক্ষণাত্ পুনরায় সংযোগ স্থাপন করে। আমি কি ঘটছে তা ভুল বোঝাবুঝি করছি, বা এটি প্রত্যাশিত আচরণ?
— kybernetikos

@ কাইবারনেটিকোস হ্যাঁ, আমি এটি আশা করব - ক্লায়েন্ট সর্বোপরি তাদের নিজের সাথে কী করবেন তা চয়ন করতে পারেন। প্রায়শই, আপনি বর্তমান সংযোগটি থেকে অন্যদিকে লাথি মারতে চান , কোনও লেখার সময়সীমা পেরিয়ে যাওয়ার কারণে বলে - এটির পরে পুনরায় সংযুক্তি সম্ভবত আকাঙ্ক্ষিতও হবে।
— nh2

সুতরাং আপনি কি ক্লায়েন্টকে 'চলে যান এবং আমি সত্যই এটি বোঝায়' বলার কোনও উপায় সম্পর্কে জানেন? আমি কোনও ক্লায়েন্ট খারাপ আচরণ করছে এবং আমার সার্ভারে সংস্থান ব্যবহার করতে চাইছে না তা নির্ধারণের দিক থেকে আমি ভাবছি from
— kybernetikos

@ কেবারনেটিকোস না, আপনি এটি করতে পারবেন না (সাধারণত) আপনি যদি ক্লায়েন্টের পাশে প্রোগ্রামিং করে থাকেন তবে অবশ্যই আপনি যে কোনও যুক্তি প্রয়োগ করতে পারেন, যেমন এটি পুনরায় সংযোগ স্থাপন থেকে বিরত করুন। যদি তা না হয় তবে বারবার ব্যবহারকারীদের লাথি মারতে হবে, বা যদি প্রয়োজন হয় তবে স্ট্যান্ডার্ড ব্লকিং কৌশল অবলম্বন করতে হবে; এগুলি নিম্ন স্তরের প্রয়োগ করা হয় (উদাঃ iptables), তত বেশি সংস্থান আপনি সংরক্ষণ করবেন। বেশিরভাগ ক্ষেত্রে, ক্লায়েন্টকে কেবল লাথি মেরে ফেলা যথেষ্ট হওয়া উচিত, যেহেতু সোকেটিও দ্রুত তা সংযুক্ত করে না, এবং যদি কেউ সত্যই আপনাকে ডস করতে চায় তবে তাদের অন্য উপায় রয়েছে (যেমন আপনার কাছ থেকে পৃষ্ঠা ডাউনলোড করা)।
— এনএইচ 2

1
@ মনিশস্পাল আপনার পক্ষে এটির জন্য একটি নতুন প্রশ্ন সম্ভবত খোলা উচিত, এটি মন্তব্যে ভালভাবে খাপ খায় না।
— nh2

15

socket.disconnect() সার্ভারের দিকে নয়, কেবল ক্লায়েন্টের পক্ষে ব্যবহার করা যেতে পারে।

Client.emit('disconnect')সার্ভারে সংযোগ বিচ্ছিন্ন ইভেন্টটি ট্রিগার করে তবে ক্লায়েন্টকে কার্যকরভাবে সংযোগ বিচ্ছিন্ন করে না। ক্লায়েন্ট বিচ্ছিন্নতা সম্পর্কে সচেতন নয়।

সুতরাং প্রশ্নটি রয়ে গেছে: কীভাবে কোনও ক্লায়েন্টকে সার্ভার দিক থেকে সংযোগ বিচ্ছিন্ন করতে বাধ্য করবেন?


1
Client.emit('disconnect')সাম্প্রতিক সকেট.আইও সংস্করণগুলির সাথে আপনাকে আর ম্যানুয়ালি কল করতে হবে না , এখন একটি সার্ভার-সাইড রয়েছে socket.disconnect()(আমার উত্তর দেখুন)।
— এনএইচ 2

5
সাম্প্রতিক আপডেটগুলির কারণে, আপনার অ্যামসওয়ারটি এখন ভুল is
— কোরাজা

আমি সম্মত, এই উত্তরটি আর বৈধ নয়, কারণ এখন socket.disconnect()সার্ভারের পাশেও ব্যবহার করা যেতে পারে।
— ভ্যাসিলিস বারজোকাস

@ ভ্যাসিলিস বারজোকাস যদি আমি কলব্যাক চাই এবং disconnect()ফাংশন শেষ হয়ে যাওয়ার পরে কলব্যাকটিতে কিছু পরামিতিগুলি পাস করি তবে কী হবে ?
— newguy

সম্মত বার্তাগুলির একটি সেট তৈরি করুন যেখানে একটি পক্ষ অন্য পক্ষকে জানিয়ে দেয় যে তারা সংযোগ বিচ্ছিন্ন করতে চায়, তারপরে আপনার যা করতে হবে তা করুন এবং তারপরে আসলে সংযোগ বিচ্ছিন্ন করুন।
— মাইক 'পোম্যাক্স' কামারম্যানস

8

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

ক্লায়েন্টে:

socket.emit('forceDisconnect');

সার্ভারে:

socket.on('forceDisconnect', function(){
    socket.disconnect();
});

7
কারণ ক্লায়েন্ট-সাইড কোডটি আপনি চান ঠিক তেমন কাজ করতে কখনই নির্ভর করা যায় না। ব্যবহারকারীরা সহজেই এটি পরিবর্তন করতে পারেন।
— কৌস্তুব কারকরে

4

আপনার সকেটের নামকৃত সকেট ধরে, ব্যবহার করুন:

socket.disconnect()

2
দুর্ভাগ্যক্রমে, এটি কাজ করে না। আমি সার্ভার-সাইড থেকে একটি নির্দিষ্ট ক্লায়েন্টের সাথে সংযোগটি বন্ধ করার চেষ্টা করছি।
— ড্যানিয়েল কেনে

4

যারা এটি গুগলে পেয়েছেন তাদের জন্য - এই মুহুর্তে এখানে একটি সমাধান রয়েছে:

Socket.disconnect()ক্লায়েন্টকে কিক্স করে (সার্ভার-সাইড)। ক্লায়েন্টের সাথে সংযুক্ত থাকার কোনও সুযোগ নেই :)


সার্ভারে সংযোগ বিচ্ছিন্ন করা ব্যবহারকারীর সকেট আমি কীভাবে খুঁজে পাব?
— মনীষ স্বপ্নাল

মনীশ: সকেটের disconnectইভেন্টটি সংযোগ বিচ্ছিন্ন হয়েছে কিনা তা শোনার জন্য । closeইভেন্টটিও হতে পারে , আমি যথেষ্ট নিশ্চিত নই। এটি সম্পর্কে আরও তথ্যের জন্য সকেট.আইওর ডকুমেন্টেশন দেখুন।
— সাসচা গেহলিচ


3

আমার ক্ষেত্রে আমি অন্তর্নিহিত সংযোগটি ছিন্ন করতে চেয়েছিলাম যে ক্ষেত্রে আমাকে ফোন socket.disconnect(true)করতে হয়েছিল যেহেতু আপনি দেখতে পাচ্ছেন যে এখানে উত্স থেকে প্রয়োজন


2

client._onDisconnect() কাজ করা উচিত


1
এটি নিখুঁতভাবে কাজ করে .. আমি ক্লায়েন্টগুলিতে নিজের নিজস্ব ম্যাপিং বজায় রাখি .. সেই ম্যাপিংটি ব্যবহার করে ... সহজেই ক্লায়েন্টদের সংযোগ বিচ্ছিন্ন করে
— দিচ্ছি

1

সকেট.আইও সংঘবদ্ধ / সংযোগ / হৃদস্পন্দনগুলি পরীক্ষা করতে যাতে ইভেন্টগুলি করতে পারে তে ইভেন্টইমিটার প্যাটার্নটি ব্যবহার করে। Client.emit('disconnect');


1

এটি আমার পক্ষে কার্যকর হয়নি :

`socket.disconnect()` 

এটি আমার পক্ষে কাজ করেছে:

socket.disconnect(true)

হস্তান্তর trueহ'ল ক্লায়েন্টের সাথে অন্তর্নিহিত সংযোগটি বন্ধ করে দেবে এবং ক্লায়েন্টের সুনির্দিষ্ট নয় নামমাত্র স্থান সকেট আইও ডকুমেন্টেশনের সাথে সংযুক্ত রয়েছে ।


উদাহরণ ব্যবহারের ক্ষেত্রে: ক্লায়েন্ট অবৈধ অ্যাক্সেস টোকেন (অ্যাক্সেস টোকেন ওয়েব সকেট সার্ভারের সাথে সংযোগের প্যারামগুলির সাথে হস্তান্তরিত) দিয়ে ওয়েব সকেট সার্ভারের সাথে সংযুক্ত করে। ওয়েব সকেট সার্ভার ক্লায়েন্টকে তার অবৈধ অ্যাক্সেস টোকেনের কারণে সংযোগটি বন্ধ করতে চলেছে তা অবহিত করে:

// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
    console.log(data);       // (4) server receives 'invalidAccessTokenEmitReceived' from client
    socket.disconnect(true); // (5) force disconnect client 
});

// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => { 
//     // (3) the client ack emits to server
//     fn('invalidAccessTokenEmitReceived');
// });

0

সংযোগের পরে সমস্ত ইভেন্ট উপেক্ষা করার জন্য আমি সংযুক্ত ক্লায়েন্টের জন্য client.emit('disconnect')+ ব্যবহার করছি usingclient.removeAllListeners()


0

আমি ক্লায়েন্ট পক্ষ ব্যবহার করছি socket.disconnect();

client.emit('disconnect') didnt work for me

0

ব্যবহার:

সকেট.ডিসকনেক্ট () // ঠিক আছে

ব্যবহার করবেন না :

socket.disconnect ()


0

আপনি socket = undefinedকোন সকেট সংযুক্ত করেছেন তা মুছে ফেলতে পারেন। সুতরাং যখন সংযুক্ত করতে চান সকেট (ইউআরএল)

সুতরাং এটি দেখতে হবে

const socketClient = require('socket.io-client');

let socket;

// Connect to server
socket = socketClient(url)

// When want to disconnect
socket = undefined;

-1

একটি অ্যারেতে নতুন সকেট সংযোগ যুক্ত করুন এবং তারপরে আপনি যখন সমস্তটি বন্ধ করতে চান - সেগুলি দিয়ে লুপ করুন এবং সংযোগ বিচ্ছিন্ন করুন। (সার্ভার পাশ)

var socketlist = [];

   io.sockets.on('connection', function (socket) {
        socketlist.push(socket);  
        //...other code for connection here..
   });


    //close remote sockets
    socketlist.forEach(function(socket) {        
        socket.disconnect();                      
    });    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.