সকেট.আইও - আমি কীভাবে সংযুক্ত সকেট / ক্লায়েন্টের একটি তালিকা পেতে পারি?


159

আমি বর্তমানে সংযুক্ত সমস্ত সকেট / ক্লায়েন্টের একটি তালিকা পাওয়ার চেষ্টা করছি।

io.sockets দুর্ভাগ্যক্রমে একটি অ্যারে ফিরিয়ে দেয় না।

আমি জানি যে আমি কোনও অ্যারে ব্যবহার করে আমার নিজস্ব তালিকা রাখতে পারি, তবে 2 কারণে এটি সর্বোত্তম সমাধান বলে মনে করবেন না:

  1. অতিরেক। সকেট.আইও ইতিমধ্যে এই তালিকার একটি অনুলিপি রাখে।

  2. সকেট.আইও ক্লায়েন্টদের (যেমন socket.set('nickname', 'superman'):) জন্য স্বেচ্ছাসেবী ক্ষেত্রের মান নির্ধারণের জন্য পদ্ধতি সরবরাহ করে তাই আমার নিজের তালিকাটি বজায় রাখলে আমাকে এই পরিবর্তনগুলি বজায় রাখা দরকার।

সহায়তার প্রয়োজন?


আপনি কি কেবল আইও.সকেটকে একটি অ্যারে রূপান্তর করতে পারবেন না?
— ম্যাক

2
0.7.6 io.sockets.sockets তৈরি করুন দৃষ্টিনন্দন একটি হ্যাশ বস্তুর আইডি => সকেট হয়
— MAK

1
আমি লক্ষ্য করেছি, তবে এটি অদ্ভুত অভিনয় করছে (মানক সকেট অবজেক্টের মতো মনে হয় না)। উদাহরণস্বরূপ আমি চেষ্টা করেছি: পেস্টবিন.com / fxuzVckS তবে এটি বলছে যে সকেট অবজেক্টে ' গেট ' পদ্ধতি থাকে না।
— অ্যান্ডি হিন

3
socketআইডি, io.sockets.sockets[socket]সকেট হয়।
— মাক

2
প্রথম যুক্তি হ'ল errএবং যদি আপনি মেমরি স্টোর ব্যবহার করেন তবে সর্বদা এটি null। .get('nickname', function(err, nickname) { ... })
— মাক

উত্তর:


173

সকেট.আইও 0.7 এ আপনার clientsনেমস্পেসগুলিতে একটি পদ্ধতি রয়েছে, এটি সমস্ত সংযুক্ত সকেটের একটি অ্যারে প্রদান করে।

কোনও নাম স্থানের জন্য এপিআই:

var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

একটি নেমস্পেসের জন্য

var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`

আশা করি এটি ভবিষ্যতে কাউকে সহায়তা করে

দ্রষ্টব্য: এই সমাধানটি কেবলমাত্র 1.0 এর পূর্ববর্তী সংস্করণে কাজ করে


আপডেট 2020 মার্চ 06

1.x এবং উপরে থেকে, দয়া করে এই লিঙ্কটি দেখুন: সকেট.আইওতে চ্যাট রুমে কত লোক রয়েছে তা পেয়ে getting


3
আমি মনে করি তারা ক্লায়েন্টদের পদ্ধতিটি 1.0 এ
— ফেলেছে

7
এটি সম্পূর্ণ পুনর্লিখনের কারণে তারা 1.0 এ প্রায় সমস্ত কিছু ফেলেছে। তবে 1.0 বছরের পর বছর ধরে অপ্রকাশিত। 1.0 এ আপনাকে connectedনেমস্পেসের অবজেক্টটি ব্যবহার করতে হবে ।
— তৃতীয় ইডেন

6
@ থার্ডইডেন, নেমস্পেসের সংযুক্ত বস্তুটি ব্যবহারের জন্য সিনট্যাক্সটি কী? var clients = io.sockets.connected();স্পষ্টতই কাজ করে না। ধন্যবাদ
— কেয়া টোস্ট

5
১.x এবং তার থেকে উপরে: স্ট্যাকওভারফ্লো.com
— মুসা হায়দারি

TypeError: fn.bind কোন ফাংশন নয়
— ইমান Marashi

101

সকেট.ইও 1.4

Object.keys(io.sockets.sockets); আপনাকে সমস্ত সংযুক্ত সকেট দেয়।

Socket.io 1.0 Socket.io 1.0 হিসাবে, প্রকৃত স্বীকৃত উত্তরটি আর বৈধ নয়। তাই আমি একটি ছোট ফাংশন করেছি যা আমি একটি অস্থায়ী সংশোধন হিসাবে ব্যবহার করি:

function findClientsSocket(roomId, namespace) {
    var res = []
    // the default namespace is "/"
    , ns = io.of(namespace ||"/");

    if (ns) {
        for (var id in ns.connected) {
            if(roomId) {
                var index = ns.connected[id].rooms.indexOf(roomId);
                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            } else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res;
}

অপি ফর নো নোস্পেস হয়ে যায়

// var clients = io.sockets.clients();
// becomes : 
var clients = findClientsSocket();

// var clients = io.sockets.clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room');

নেমস্পেসের জন্য এপিআই হয়ে যায়:

// var clients = io.of('/chat').clients();
// becomes
var clients = findClientsSocket(null, '/chat');

// var clients = io.of('/chat').clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room', '/chat');

এই সম্পর্কিত প্রশ্নটিও দেখুন , যাতে আমি একটি ফাংশন দিচ্ছি যা প্রদত্ত ঘরের জন্য সকেটগুলি ফেরত দেয়।

function findClientsSocketByRoomId(roomId) {
var res = []
, room = io.sockets.adapter.rooms[roomId];
if (room) {
    for (var id in room) {
    res.push(io.sockets.adapter.nsp.connected[id]);
    }
}
return res;
}

সকেট.আইও 0.7

কোনও নাম স্থানের জন্য এপিআই :

var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

জন্য একটি নামস্থান

var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`

দ্রষ্টব্য: যেহেতু দেখে মনে হচ্ছে যে সকেট.আইপিএল ভাঙার ঝুঁকির ঝুঁকিপূর্ণ এবং কোনও সমাধান বাস্তবায়নের বিশদগুলিতে নির্ভর করে তাই এটি ক্লায়েন্টদের নিজেরাই ট্র্যাক করার বিষয় হতে পারে:

var clients = [];

io.sockets.on('connect', function(client) {
    clients.push(client); 

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});

3
এই জন্য আপনাকে ধন্যবাদ. আমি অবাক হয়েছি তারা এই কার্যকারিতাটি বাইরে নিয়ে গেছে।
— টাইলার স্কট

1
@ টাইলারস্কট আমাকেও, বিশেষত প্রদত্ত যে এটি তাদের মাইগ্রেশন গাইডের আওতায় নেই (যতক্ষণ না আমি কিছু মিস করছি)। socket.io/docs/migrating-from-0-9
— nha

@ না, এটি আমার পক্ষে কাজ করে না তবে সকেটের অ্যারের পরিবর্তে 0, 1 এবং 2 ইত্যাদির মতো পূর্ণসংখ্যার অ্যারে দেয় returns কোন ধারনা?
— দ্য পিক্সেলপনি

একাধিক নোড সম্পর্কে? কারণ আমি রেডিস স্টোর সহ একাধিক নোড ব্যবহার করছি
— জন

3
আপনি যে উত্তরটি দিয়েছেন তা হুবহু, তবে এটি রেডিস স্টোর সার্ভারের সাথে একাধিক নোডের জন্য কাজ করছে না। 1 নোড প্রক্রিয়া থেকে, আপনি সকেট সংযুক্ত কিনা তা পরীক্ষা করতে পারবেন না ns.cnnected [আইডি] ব্যবহার করে
— জন

46

Socket.io 1.0 এর পরে আমরা ব্যবহার করতে পারি না

io.sockets.clients(); 
or
io.sockets.clients('room'); 

আর। পরিবর্তে আপনি নিম্নলিখিত ব্যবহার করতে পারেন

var clients_in_the_room = io.sockets.adapter.rooms[roomId]; 
for (var clientId in clients_in_the_room ) {
  console.log('client: %s', clientId); //Seeing is believing 
  var client_socket = io.sockets.connected[clientId];//Do whatever you want with this
}

3
আমি পরিবর্তিত var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
— হয়েছি

37

সকেট.আইও 1.x ব্যবহার করে:

সংযুক্ত ক্লায়েন্টদের অ্যারে পান:

io.engine === io.eio // => true
Object.keys(io.engine.clients) // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ]
Object.keys(io.eio.clients)    // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ]

সংযুক্ত ক্লায়েন্টের সংখ্যা পান:

io.engine.clientsCount // => 2
io.eio.clientsCount    // => 2

32

সকেট.আইও ১.৩ এ খুব সাধারণ:

io.sockets.sockets- সংযুক্ত সকেট অবজেক্টযুক্ত একটি অ্যারে। আপনি যদি প্রতিটি সকেটে ব্যবহারকারীর নাম সংরক্ষণ করেন তবে আপনি এটি করতে পারেন:

io.sockets.sockets.map(function(e) {
    return e.username;
})

গম্ভীর গর্জন। আপনার কাছে সমস্ত সংযুক্ত ব্যবহারকারীর নাম রয়েছে।


2
ধন্যবাদ! সরলতার জন্য +1। আপনি কি জানেন যে এই পদ্ধতির মধ্যে কোনও পার্থক্য আছে এবং, বলুন, জোসেফ ডাইকস্ট্রার উত্তর? (Object.keys(io.engine.clients)
— সাইক্লিং ভাষাবিদ

4
এটি v1.4.5 এ কাজ করে না। এখনও একটি সমাধান নিয়ে কাজ করা হচ্ছে
— নুনো ফুর্তাদাদো

আপনি এটি পেয়েছেন? \
— 20:34-

2
TypeError: io.sockets.sockets.map কোনও ফাংশন নয়
— Király István

23

আমি আজ এই ব্যথা পেরিয়েছি। যদি তারা তাদের এপিআইয়ের জন্য উপযুক্ত ডকুমেন্টেশন তৈরি করতে পারে সকেট.ইও অনেক ভাল।

যাইহোক, আমি আইওএসকেটগুলি অনুসন্ধান করার চেষ্টা করেছি এবং আমরা ব্যবহার করতে পারি এমন অনেকগুলি বিকল্প পেয়েছি:

io.sockets.connected //Return {socket_1_id: {}, socket_2_id: {}} . This is the most convenient one, since you can just refer to io.sockets.connected[id] then do common things like emit()
io.sockets.sockets //Returns [{socket_1}, {socket_2}, ....]. Can refer to socket_i.id to distinguish
io.sockets.adapter.sids //Return {socket_1_id: {}, socket_2_id: {}} . Looks similar to the first one but the object is not actually the socket, just the information.

// Not directly helps but still relevant
io.sockets.adapter.rooms //Returns {room_1_id: {}, room_2_id: {}}
io.sockets.server.eio.clients //Return client sockets
io.sockets.server.eio.clientsCount //Return number of connected clients

এছাড়াও, নোট করে রাখুন যে সকেট.ইও নামের সাথে স্থানটি ব্যবহার করার সময়, উপরোক্ত পদ্ধতিগুলি ভেঙে যাবে যেহেতু আইও.সকেটগুলি কোনও বস্তুর পরিবর্তে অ্যারে হয়ে যায়। সমাধানের জন্য, কেবল io দ্বারা সকেটগুলি প্রতিস্থাপন করুন (অর্থাত্ io.sockets.connected io.connected হয়ে যায়, io.sockets.adapter.rooms io.adapter.rooms হয়ে যায় ...)

Socket.io 1.3.5 এ পরীক্ষিত on


1
@ .Ый আপনি যদি নেমস্পেস ব্যবহার না করেন তবে এটি কাজ করবে। আপনি যদি নেমস্পেস ব্যবহার করছেন তবে io.server.eio.clientsCount
— Thanh Nguyen

2
হ্যাঁ, অফিসিয়াল ডকুমেন্টেশনটি এত বেশি উন্নতি করতে পারে
— কোডএন্ডক্যাটস

18

সংস্করণ +2.0

সংস্করণ +২.০-তে আপনি যে স্থানের নাম / কক্ষ / নোডটি জিজ্ঞাসা করছেন তা নির্দিষ্ট করে।

সম্প্রচারের মতো, ডিফল্ট হ'ল ডিফল্ট নেমস্পেস ('/') থেকে সমস্ত ক্লায়েন্ট:

const io = require('socket.io')();  
io.clients((error, clients) => {
      if (error) throw error;
      console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB]
});

নির্দিষ্ট নেমস্পেসের সাথে সংযুক্ত ক্লায়েন্ট আইডির একটি তালিকা পান (প্রযোজ্য সমস্ত নোড জুড়ে)।

const io = require('socket.io')();
io.of('/chat').clients((error, clients) => {
     if (error) throw error;
     console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD]
});

নেমস্পেসের ঘরে সমস্ত ক্লায়েন্ট পেতে একটি উদাহরণ:

const io = require('socket.io')();
io.of('/chat').in('general').clients((error, clients) => {
      if (error) throw error;
      console.log(clients); // => [Anw2LatarvGVVXEIAAAD] 
});

এটি সরকারী দস্তাবেজ থেকে: সকেট.আইও সার্ভার-এপিআই


1
সমস্ত সকেট অবজেক্ট দেখার উপায় আছে ? উদাহরণস্বরূপ, যদি আমি socket.usernameসংযোগের সময় প্রতিটি সকেটে কোনও সম্পত্তি যুক্ত করি, তবে আমি এই সমস্ত সকেট অবজেক্টগুলি দেখতে পাবার কোনও উপায় আছে (প্রতিটি সকেটে আমি যে কাস্টম বৈশিষ্ট্য যুক্ত করি তা সহ)? (রেফারেন্সের জন্য, আমি বর্তমানে কোনও গ্লোবাল অবজেক্ট ভেরিয়েবল ব্যবহার করছি যখন কোনও ক্লায়েন্ট সংযুক্ত হয় তখন অতিরিক্ত সকেটের তথ্য সঞ্চয় করতে - সুতরাং কীভাবে সেট আপ করবেন তা জিজ্ঞাসা করছেন না - 'ডিফল্ট' দ্বারা সমস্ত সকেট অবজেক্ট দেখার কোনও উপায় আছে কিনা তা জানতে আগ্রহী) ।
— ব্যবহারকারীর 1063287

1
হুম, এই উত্তর প্রতি , আমি মনে করি আপনার সাথে সমস্ত সংযুক্ত সকেট দেখতে পারেন console.log(io.sockets.connected)- এটি একটি বস্তু যেখানে প্রতিটি সম্পত্তি মান একটি "সকেট বস্তুর" যা এই বৈশিষ্ট্য রয়েছে বলে মনে হয় nsp, server, adaptor, id(একটি স্ট্রিং), client, conn, rooms, acks, connected, disconnected, handshake, fns, flags, _rooms, _events, _eventsCountএবং পরিশেষে usernameযা আমি সংযোগ প্রতিটি সকেট যোগ কাস্টম সম্পত্তি।
— ব্যবহারকারী 1063287

17

আমি মনে করি আমরা সার্ভার থেকে সকেট অবজেক্টটি অ্যাক্সেস করতে পারি এবং আপনি ডাক নামটি নির্ধারণ করতে পারেন এবং এর সকেট আইডিটি নির্দেশ করতে পারেন,

io.sockets.on('connection',function(socket){ 
    io.sockets.sockets['nickname'] = socket.id;
    client.on("chat", function(data) {      
        var sock_id = io.sockets.sockets['nickname']
        io.sockets.sockets[sock_id].emit("private", "message");
    });    
});

চালু থেকে disconnectদয়া করে ডাক নামটি সরিয়ে দিন io.sockets.sockets।


'ক্লায়েন্ট.অন' এর উদ্দেশ্য কী? আপনি কি এই জাতীয় কোড ব্যবহার করতে পারেন (কেবলমাত্র 1 সকেটের ডেটা গ্রহণ করছেন) ?: io.sockets.sockets [sock_id] .on ('newmessage', ফাংশন (ডেটা) so কনসোল.লগ (ডেটা)});
— হক

9

এটি সকেট.আইও 1.3 এ অ্যাক্সেস করার সেরা উপায়

Object.keys(socket.adapter.rooms[room_id])


দয়া করে আমাকে এই উদাহরণটি ভাগ করে দিন, var room = io.sockets.adapter.rooms[room_id]; var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
— হ্যানি অ্যালসাম্যান

5

যে কেউ সংযুক্ত ক্লায়েন্টের কেবল একটি COUNT চায় তার জন্য আমি বিশ্বাস করি এটি এটি করবে:

io.sockets.manager.server.connections


সংযুক্ত ক্লায়েন্ট গণনা, পরীক্ষা করা হয় নি। (আরও কিছু)
— mrzmyr

5
সঠিক গণনা ব্যবহারের জন্যio.sockets.clients().length
— Ivo

2
বর্তমানে উভয় io.sockets.manager.server.connectionsএবং io.sockets.clients().lengthকাজ না। এটি আমার পক্ষে কাজ করেছে - কেবল গণনার io.engine.clientsCountজন্য - এবং ক্লায়েন্টের তালিকার জন্য io.engine.clientsCount। যেহেতু এটি 3 বছরেরও বেশি সময় ধরে এইভাবে স্থিত রয়েছে। সংযোগের তথ্য পাওয়ার কোনও নির্ভরযোগ্য উপায় বলে মনে হচ্ছে। (জোসেফ ডাইকাস্ট্রার উত্তরের ভিত্তিতে)
— আসভিন রামকৃষ্ণন

5

সকেট.আইও 1.4.4

আপনার জন্য নমুনা কোড।

function get_clients_by_room(roomId, namespace) {
        io.of(namespace || "/").in(roomId).clients(function (error, clients) {
            if (error) { throw error; }
            console.log(clients[0]); // => [Anw2LatarvGVVXEIAAAD]
            console.log(io.sockets.sockets[clients[0]]); //socket detail
            return clients;
        });
    }

আমি মনে করি কাউকে এই কোড ব্লক করতে সহায়তা করবে।


4

সকেট.আইও 1.4 এ

সমস্ত সংযুক্ত ব্যবহারকারীদের অ্যারে পেতে:

var allConnectedClients = Object.keys(io.sockets.connected);// This will return the array of SockeId of all the connected clients

সমস্ত ক্লায়েন্টদের গণনা পেতে:

var clientsCount = io.engine.clientsCount ; // This will return the count of connected clients

আমি নিশ্চিত করছি যে সংস্করণ 1.5.1 মধ্যে এই কাজ socket.io
— সেবাস্টিয়ান

3

সকেট.আই.ও. 1.5 হিসাবে, সূচিপত্র থেকে অবহিত করা সূচক হিসাবে প্রদর্শিত সূচক থেকে পরিবর্তিত নোট করুন, এবং মান ওএফ দ্বারা প্রতিস্থাপিত

function findClientsSocket(roomId, namespace) {
    var res = [];
    var ns = io.of(namespace ||"/");    // the default namespace is "/"

    if (ns) {
        for (var id in ns.connected) {
            if (roomId) {
                //var index = ns.connected[id].rooms.indexOf(roomId) ;
                var index = ns.connected[id].rooms.valueOf(roomId) ; //Problem was here

                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            } else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res.length;
}

Socket.io সংস্করণ 2.0.3 এর জন্য, নিম্নলিখিত কোডগুলি কাজ করে:

function findClientsSocket(io, roomId, namespace) {
    var res = [],
        ns = io.of(namespace ||"/");    // the default namespace is "/"

    if (ns) {
        for (var id in ns.connected) {
            if(roomId) {
                // ns.connected[id].rooms is an object!
                var rooms = Object.values(ns.connected[id].rooms);  
                var index = rooms.indexOf(roomId);
                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            }
            else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res;
}

আপনি আমাকে কতটা বেদনা বাঁচাতে পারবেন তা কল্পনা করতে পারবেন না
— নিকোলাসউমিন

তবে সকেট.ইও সংস্করণটি এখনও 1.5 নয়! এটি এখন 1.4.8
— লেজেক.হানুসজ

@ মোলআইসকিং ওব্রিগাদো অ্যামিগো!

2

সকেট.আইও 1.3 এ আমি এটি 2 লাইনে সম্পন্ন করেছি

var usersSocketIds = Object.keys(chat.adapter.rooms['room name']);
var usersAttending = _.map(usersSocketIds, function(socketClientId){ return chat.connected[socketClientId] })

2

সকেট.ইও 1.7.3 (+):

ফাংশন getConnectedList ()
{
    চলুন তালিকা = []
    
    (io.sockets.connected এ ক্লায়েন্ট যাক)
    {
        list.push (ক্লায়েন্ট)
    }
    
    রিটার্ন তালিকা
}

কনসোল.লগ (getConnectedList ())

// রিটার্ন ['yIfhb2tw7mxgrnF6AAAA', 'qABFaNDSYknCysbgAAAB']


2

সংস্করণ ২.৩ এর জন্য এটি কাজ করে এবং এটি আপনাকে সকেটটিও পেয়ে যাবে , এটি আমার কাছে মনে হয় যে সকেটআইও খুব দ্রুত পরিবর্তন করছে এবং কিছু সময়ের জন্য এটি ব্যবহার করার পরে খুব কম পাঠযোগ্য ডকুমেন্টেশন দিয়ে চলেছে।

ioSite.of('/').in(roomId).clients((error, clients) => {
    if (error) throw error;
    for (var i=0;i<clients.length;i++) {
        clientId=clients[i];
        console.log(clientId);

        // load the socket of your namespace
        var socket=ioSite.of('/').in(roomId).connected[clientId]
        console.log(socket.constructor.name);
        console.log(socket.id);
    }
});

এখনও এটি সঠিক বোধ করে না, যেমন আমি সর্বদা সকেট আইওর সাথে এই অনুভূতিটি বোধ করি


1
আমি এটি একটি আবর্জনা গ্রন্থাগার মনে করতে শুরু করছি। কেবলমাত্র এটি কেবল নির্বিঘ্নে অনেক ধরণের ডেটা (জসন, বাইনারি ইত্যাদি) স্থানান্তরিত করে অন্যথায় পুরো আর্কিটেকচারটি বকাঝকা এবং 1 চ্যাটের অ্যাপ্লিকেশনটিতে 1 এর বাইরে স্কেল করে না
— মুহাম্মদ উমার

1

আমি বিশ্বাস করি আপনি সকেটের পরিচালকের সম্পত্তি থেকে এটি অ্যাক্সেস করতে পারবেন?

var handshaken = io.manager.handshaken;
var connected = io.manager.connected;
var open = io.manager.open;
var closed = io.manager.closed;

অ্যারেনের সংযোগ বিচ্ছিন্ন ক্লায়েন্টদের সাথে সমস্যা রয়েছে বলে থার্ডইডেনের উত্তরটি আমার পক্ষে কার্যকর হয়নি which Object.keys (io.manager.open)। দৈর্ঘ্য আমার অভিজ্ঞতার মধ্যে সবচেয়ে নির্ভরযোগ্য গণনা হিসাবে দেখা গেল। io.of ('/ namespace')।
— ওয়েস জনসন

1

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

আমার নির্দিষ্ট সমস্যাটি হ'ল একই সকেটটি একই ঘরে বেশ কয়েকবার যোগদান করছিল। এর সমাধানটি ছিল সকেটে এর কক্ষের সম্পত্তিটির মধ্যে ইতিমধ্যে ঘর ছিল কিনা তা পরীক্ষা করা।

var room = myObj.id.toString();
if (socket.rooms.indexOf(room) === -1) {
    socket.join(room);
    socket.emit('subscribed', {to : room});
} else {
    console.log("Already in room");
}

আশা করি এটি কাউকে সাহায্য করবে।


আমি মনে করি যে 'যদি' বিবৃতিটি এড়ানো সম্ভব, যদি আপনি ক্লায়েন্টকে সকেটের সংযোগের পরে ঘরে যোগদান করেন।
— ছায়ামোর

MyObj কোথা থেকে আসে? আপনি কিভাবে এই মান পৌঁছেছেন?
— মাইকেল ড্রাগন

একটি চ্যানেল হিসাবে কাজ করে এমন একটি ডাটাবেসের রেকর্ড হ'ল মাইকড্রেপার মাইঅবজেক্ট। এটি যেটি সমাধান করে তা হ'ল আপনি যখনই ডাটাবেসে কোনও পরিবর্তন ঘটে তখন আপনার সমস্ত ক্লায়েন্ট আপডেট হওয়া চান, উদাহরণস্বরূপ কোনও ব্যবহারকারী তার নাম আপডেট করে এবং সমস্ত সংযুক্ত ক্লায়েন্ট একটি আপডেট পান। সুতরাং আমি সেই আইডির জন্য একটি ঘর তৈরি করেছি, এটি অনন্য (BSON) দেওয়া। এটি আমার ব্যবহারের ক্ষেত্রে খুব নির্দিষ্ট মান, সুতরাং আমি যদি কোনও বিভ্রান্তি সৃষ্টি করি তবে আমি দুঃখিত। যদি আপনার সাহায্যের প্রয়োজন :) আমাকে জানতে দিন
— গাস Ortiz,

@ জেএমআর আমার অ্যাপ্লিকেশনটির প্রকৃতির কারণে এমনটি ঘটেছিল যে কোনও সকেট একাধিকবার সাবস্ক্রাইব হয়েছে, এজন্য আমাকে এই চেকটি যুক্ত করতে হয়েছিল।
— গাস অর্টিজ

1

এটি সকেট.আইও 1.0+ এর সহজতম উপায়, যদি আপনি নাম স্থান বা ঘর ব্যবহার না করে থাকেন।

io.nsps["/"].sockets.length

এটি ডিফল্ট নেমস্পেস দেখে এবং সকেট অ্যারের দৈর্ঘ্য নির্ধারণ করে, ব্যবহারের প্রয়োজন ছাড়াই Object.keys()


1

সংস্করণ 1.5.1 অনুসারে, আমি এর সাথে একটি নেমস্পেসে সমস্ত সকেট অ্যাক্সেস করতে সক্ষম হয়েছি:

var socket_ids = Object.keys(io.of('/namespace').sockets);
socket_ids.forEach(function(socket_id) {
    var socket = io.of('/namespace').sockets[socket_id];
    if (socket.connected) {
        // Do something...
    }
});

কিছু কারণে তারা সকেট আইডি সঞ্চয় করতে অ্যারের পরিবর্তে একটি সরল বস্তু ব্যবহার করছেন're


এই এক কাজ করে। Io.of ('') এর একটি খালি স্ট্রিং নাম স্থান ছাড়াই কাজ করে।
— কিরলি ইস্তভান

@ কিরিলিস্টভান আমি এখনই কিছুক্ষণ এর জন্য তাকাতে পারি নি, তবে আমি মনে করি আপনি of()এই ক্ষেত্রে শৃঙ্খলিত কলটি পুরোপুরি সরাতে পারবেন ।
— rppc

1

ক্লাস্টার মোডের জন্য, রেডিস-অ্যাডাপ্টার ব্যবহার করে

io.in(<room>).clients(function(err, clients) {

});

যেহেতু প্রতিটি সকেট নিজেই একটি ঘর, তাই সকেটটি একই ব্যবহার করে কিনা তা আবিষ্কার করতে পারে।


0

ES6 জেনারেটর ব্যবহার করে নামস্পেস থেকে সংযুক্ত সকেটের হ্যাশটিকে অ্যারেতে রূপান্তর করার দ্রুত উপায় এখানে রয়েছে (সকেট.আইও> = v1.0.0 এর ক্ষেত্রে প্রযোজ্য):

io.on('connection', function(socket) {
  var hash = io.of('/').connected
  var list = null

  hash[Symbol.iterator] = function*() {
    // for..of loop to invoke Object.keys() default iterator
    // to get the array values instead of the keys
    for(var id of Object.keys(hash)) yield hash[id]
  }

  list = [...hash]
  console.log(Array.isArray(list)) // true
})

0

আমি জানি না এটি এখনও চলছে কিনা। তবে এর মতো কিছু আমি ব্যবহার করে শেষ করেছি (আমি প্রতিটি সংযুক্ত সকেটে একটি সেশন অবজেক্ট রাখি , যার মধ্যে ব্যবহারকারী নাম এবং অন্যান্য তথ্য থাকে:

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return io.sockets.connected[socketId].session.username;
});

0

যদি প্রকল্পটির একটি সকেট.আইও ক্লাস্টার থাকে তবে এর অর্থ সকেট.আইও-রেডিস অ্যাডাপ্টার ব্যবহার করা হচ্ছে।

যদি উপরের মত কেস হয় তবে সমস্ত সংযুক্ত সকেট আইডি প্রক্রিয়াটি অবশ্যই সকেট.আইও-রেডিস অ্যাডাপ্টারের মাধ্যমে প্রয়োগ করতে হবে । নীচের উদাহরণগুলি এর জন্য ব্যবহার করা যেতে পারে;

io.of('/').adapter.clients(function (err, clients) {
  console.log("clients: ", clients); // an array containing all connected socket ids
});


io.of('/').adapter.allRooms(function (err, rooms) {
  console.log("all rooms: ", rooms);
});

আরও তথ্যের জন্য দয়া করে সকেট.আইও-রেডিস গিথুব পৃষ্ঠা দেখুন।


0

socket.io@1.7.3

সকেটের অ্যারে সংযুক্ত হওয়ার জন্য আমি অবজেক্ট.কিগুলি ব্যবহার করেছি। তারপরে একই অ্যারেতে পুনরায় আইট্রেট করুন মানচিত্র ফাংশন সহ অবজেক্টের নতুন অ্যারে তৈরি করতে

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return { socket_id : socketId, socket_username: io.sockets.connected[socketId].username };
});

// test
console.log(connectedUsers);

সম্ভবত এই উত্তরটি সকেট আইডি / ব্যবহারকারীর নাম অ্যারে পেতে সহায়তা করতে পারে।


1
হাই - আপনি দয়া করে ইংরেজিতে ব্যাখ্যা করতে পারেন কীভাবে এটি সমস্যার সমাধান করে? এইভাবে এটি কেবল একটি কোড-উত্তর উত্তর হবে না। ধন্যবাদ!
— ম্যাক্স ভন হিপ্পেল

0

v.10

var clients = io.nsps['/'].adapter.rooms['vse'];
/* 
'clients' will return something like:
Room {
sockets: { '3kiMNO8xwKMOtj3zAAAC': true, FUgvilj2VoJWB196AAAD: true },
length: 2 }
*/
var count = clients.length;  // 2
var sockets = clients.map((item)=>{  // all sockets room 'vse'
       return io.sockets.sockets[item];
      });
sample >>>
var handshake  = sockets[i].handshake; 
handshake.address  .time .issued ... etc.

1
আপনি কেন 'এটি সর্বোত্তম উপায়' এবং আপনার উত্তরটি উপরের সমস্ত উত্তরগুলির মধ্যে কীভাবে কিছু যুক্ত করে তা কিছু প্রসঙ্গ যুক্ত করতে পারলে ভাল good কোড কিছু, তবে একটি উত্তরেরও কিছু ব্যাখ্যা থাকতে হবে। আপনি দেখতে পাচ্ছেন যে এই প্রশ্নের আরও অনেক উত্তর রয়েছে। আপনার উত্তর অবশ্যই বিষয়টিতে আরও কিছু এনে দেবে, অন্যথায় এটি অনর্থক।
— নাথান রিপার্ট

এর সাথে socket.io 2.1.1 , আমি পেয়েছি TypeError: clients.map is not a functionএবং যদিও এটি আশাব্যঞ্জক বলে মনে হচ্ছে, উপরোক্ত উদাহরণটি কী অর্জন করবে তা আমি পুরোপুরি নিশ্চিত নই - আমি আশা করছিলাম যে এটি স্বয়ংক্রিয়ভাবে ব্যবহারকারীর নামের সাথে ক্লায়েন্ট অবজেক্টগুলির একটি অ্যারে তৈরি করবে :)।
— ব্যবহারকারী 1063287
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.