सॉकेट.आईओ - मुझे कनेक्टेड सॉकेट / क्लाइंट की सूची कैसे मिलेगी?


159

मैं उन सभी सॉकेट / क्लाइंट की सूची प्राप्त करने का प्रयास कर रहा हूं जो वर्तमान में जुड़े हुए हैं।

io.sockets दुर्भाग्य से एक सरणी वापस नहीं आती है।

मुझे पता है कि मैं एक सरणी का उपयोग करके अपनी खुद की सूची रख सकता हूं, लेकिन यह मत सोचो कि यह 2 कारणों से एक इष्टतम समाधान है:

  1. अतिरेक। सॉकेट.आईओ पहले से ही इस सूची की एक प्रति रखता है।

  2. सॉकेट.आईओ ग्राहकों के लिए मनमाने क्षेत्र मूल्य निर्धारित करने की विधि प्रदान करता है (अर्थात:) socket.set('nickname', 'superman')अगर मुझे अपनी सूची को बनाए रखना है तो मुझे इन परिवर्तनों को ध्यान में रखना होगा।

मदद?


क्या आप केवल io.sockets को एक सरणी में नहीं बदल सकते हैं?
mak

2
0.7.6 io.sockets.sockets में एक साधारण हैश ऑब्जेक्ट आईडी => सॉकेट है
mak

1
मैंने देखा कि, लेकिन यह अजीब काम कर रहा है (मानक सॉकेट ऑब्जेक्ट्स की तरह प्रतीत नहीं होता है)। उदाहरण के लिए मैंने कोशिश की: pastebin.com/fxuzVckS लेकिन यह कह रहा है कि सॉकेट ऑब्जेक्ट में एक 'गेट' विधि नहीं है।
एंडी हिन

3
socketआईडी है, io.sockets.sockets[socket]सॉकेट है।
mak

2
पहला तर्क है errऔर यदि आप मेमोरी स्टोर का उपयोग कर रहे हैं तो यह हमेशा होता है null.get('nickname', function(err, nickname) { ... })
mak

जवाबों:


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 और ऊपर से, कृपया इस लिंक का संदर्भ लें: सॉकेट में कितने लोग चैट रूम में हैं


3
मुझे लगता है कि उन्होंने 1.0 में क्लाइंट विधि को गिरा दिया है ... बस उस पल की जाँच कर रहे हैं ...
14

7
उन्होंने 1.0 में लगभग सब कुछ गिरा दिया क्योंकि यह एक पूर्ण पुनर्लेखन है। लेकिन 1.0 वर्षों से अप्रकाशित है। 1.0 में आपको connectedनाम स्थान की वस्तु का उपयोग करना होगा ।
3rdEden

6
@ 3rdEden, नाम स्थान की कनेक्टेड ऑब्जेक्ट का उपयोग करने के लिए वाक्यविन्यास क्या है? var clients = io.sockets.connected();स्पष्ट रूप से काम नहीं करता है। साभार
काया टोस्ट


TypeError: fn.bind कोई फंक्शन नहीं है
इमान मराशी

101

सॉकेट .io 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;
}

कोई नाम स्थान के लिए Api बन जाता है

// 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');

नाम स्थान के लिए Api बन जाता है:

// 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
@TylerScott Me, विशेष रूप से यह देखते हुए कि यह उनके माइग्रेशन गाइड में शामिल नहीं है (जब तक कि मुझे कुछ याद नहीं है)। सॉकेट .io
nha

@, यह मेरे लिए काम नहीं करता है, लेकिन सॉर्टर्स की एक सरणी के बजाय 0, 1 और 2 आदि जैसे इंटेगर की एक सरणी देता है। कोई विचार?
thePixelPony 7

कैसे कई नोड के लिए? क्योंकि मैं रेडिस स्टोर के साथ कई नोड का उपयोग कर रहा हूं
जॉन गुयेन

3
@ आप उत्तर देते हैं, लेकिन यह रेडिस स्टोर सर्वर के साथ कई नोड के लिए काम नहीं कर रहा है। 1 नोड प्रक्रिया से, आप कनेक्टेड सॉकेट की जांच नहीं कर सकते हैं या nconconected [id] का उपयोग करके नहीं कर सकते हैं
John Nguyen

46

सॉकेट.आईओ 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

सॉकेट में बहुत सरल है। 1.3:

io.sockets.sockets- कनेक्टेड सॉकेट ऑब्जेक्ट्स के साथ एक सरणी है। यदि आपने प्रत्येक सॉकेट में उपयोगकर्ता नाम संग्रहीत किया है, तो आप यह कर सकते हैं:

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

बूम। आपके पास सभी जुड़े हुए उपयोगकर्ताओं के नाम हैं।


2
धन्यवाद! सादगी के लिए +1। क्या आप जानते हैं कि इस पद्धति और जोसेफ डायकस्ट्रा के उत्तर में कोई अंतर है या नहीं? (Object.keys(io.engine.clients)
सायक्लिंग भाषाविद

4
यह v1.4.5 पर काम नहीं करता है। अभी भी एक समाधान पर काम कर रहा है
नूनो फर्टाडो

आप इसे मिला \?
ocram

2
TypeError: io.sockets.sockets.map कोई फ़ंक्शन नहीं है
István

23

मैं आज इस दर्द से गुज़रा हूं। यदि वे अपने एपीआई के लिए उचित दस्तावेज बना सकते हैं तो सॉकेट.आईओ ज्यादा बेहतर होगा।

वैसे भी, मैंने io.sockets में देखने की कोशिश की और कई विकल्प मिले जिनका हम उपयोग कर सकते हैं:

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.sockets एक सरणी बन जाता है। हल करने के लिए, बस io.sockets को io द्वारा प्रतिस्थापित करें (यानी io.sockets.connected io.connected, io.sockets.adcape.rooms बन जाता है io.adcape.rooms ...)

गर्तिका पर परीक्षण किया गया। 1.3.5


1
@ You'reелЗный यदि आप नाम स्थान का उपयोग नहीं कर रहे हैं तो यह काम करेगा। यदि आप नाम स्थान का उपयोग कर रहे हैं, तो io.server.eio.clientsCount में बदलें
थान गुयेन

2
हां, आधिकारिक दस्तावेज में इतना सुधार किया जा सकता है
CodeAndCats

18

संस्करण +2.0

संस्करण +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कनेक्ट करने पर प्रत्येक सॉकेट में एक संपत्ति जोड़ता हूं, तो क्या ऐसा कोई तरीका है जिससे मैं इन सभी सॉकेट ऑब्जेक्ट्स (कस्टम गुण मैं प्रत्येक सॉकेट में शामिल कर सकता हूं) को देख सकता हूं? (संदर्भ के लिए, मैं वर्तमान में अतिरिक्त सॉकेट जानकारी को संग्रहीत करने के लिए एक वैश्विक ऑब्जेक्ट चर का उपयोग कर रहा हूं, जब एक ग्राहक कनेक्ट होता है - इसलिए यह नहीं पूछें कि इसे कैसे सेट किया जाए - बस यह जानने में दिलचस्पी है कि क्या 'डिफ़ॉल्ट' द्वारा सभी सॉकेट ऑब्जेक्ट देखने का कोई तरीका है) ।
user1063287

1
हम्म, इस उत्तर के प्रति , मुझे लगता है कि आप के साथ सभी जुड़े सॉकेट देख सकते हैं console.log(io.sockets.connected)- यह एक वस्तु जहां प्रत्येक संपत्ति के मूल्य एक "सॉकेट वस्तु" जो इन गुणों होता है प्रतीत हो रहा है nsp, server, adaptor, id(एक स्ट्रिंग), client, conn, rooms, acks, connected, disconnected, handshake, fns, flags, _rooms, _events, _eventsCountऔर अंत में usernameजो मैं कनेक्शन पर प्रत्येक सॉकेट में जोड़ने के लिए कस्टम गुण है।
user1063287

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


'client.on' का उद्देश्य क्या है? क्या आप इस तरह से अपने कोड का उपयोग कर सकते हैं (केवल 1 सॉकेट से डेटा को स्वीकार कर रहे हैं)?
हॉक

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

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

सॉकेट .io 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

मैं पुष्टि करता हूं कि यह सॉकेट के
सेबैस्टियन

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

सॉकेट.आईओ संस्करण 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;
}

आप कल्पना नहीं कर सकते कि आपने मुझे कितना दर्द दिया है
nicholaswmin

लेकिन socket.io संस्करण अभी 1.5 नहीं है! यह अब
1.4.8 है

@MoleIsKing ओबरीगाडो अमीगो!

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

संस्करण 2.3 के लिए यह काम करता है और यह आपको सॉकेट भी प्राप्त करेगा , यह मुझे लगता है कि सॉकेटआईओ बहुत तेजी से और बहुत कम पठनीय प्रलेखन के साथ थोड़ी देर के लिए उपयोग करने के बाद बदल रहा है।

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

अभी भी यह सही नहीं लगता है, क्योंकि मैं हमेशा किसी भी तरह सॉकेट Io के साथ यह भावना रखता हूं


1
im यह एक कचरा पुस्तकालय है सोचने के लिए शुरू। केवल यह सही है कि यह मूल रूप से कई प्रकार के डेटा (जसन, बाइनरी, आदि) को स्थानांतरित करता है अन्यथा पूरी वास्तुकला बकवास है और 1 चैट ऐप पर 1 से परे पैमाने पर नहीं है
मुहम्मद उमर

1

मेरा मानना ​​है कि आप इसे सॉकेट के प्रबंधक संपत्ति से एक्सेस कर सकते हैं?

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

3rdEden का जवाब मेरे लिए कारगर नहीं रहा क्योंकि डिस्क में डिस्कनेक्ट किए गए क्लाइंट को लौटाने वाले मुद्दे हैं, जो गिनती को छोड़ देता है। Object.keys (io.manager.open) .length मेरे अनुभव में सबसे विश्वसनीय गणना बन गई। io.of ('/ namespace')। Manager.open यदि आप नेमस्पेस का उपयोग कर रहे हैं।
वेस जॉनसन

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 कहाँ से आता है? आप उस मूल्य पर कैसे पहुंचे?
माइकल ड्रेपर 5

@MikeDraper myObject एक डेटाबेस में रिकॉर्ड है जो एक चैनल के रूप में कार्य करता है। यह एक ऐसा मामला है जहां आप चाहते हैं कि जब भी डेटाबेस में कोई बदलाव होता है, तो आपके सभी ग्राहक अपडेट हो जाएं, उदाहरण के लिए उपयोगकर्ता अपना नाम अपडेट करता है और सभी कनेक्टेड क्लाइंट को अपडेट मिलता है। इसलिए मैं उस उदाहरण आईडी के लिए एक कमरा बनाता हूं, यह देखते हुए कि यह अद्वितीय है (बीएसओएन)। यह मेरे उपयोग के मामले के लिए एक बहुत ही विशिष्ट मूल्य है, इसलिए मुझे खेद है कि अगर मुझे कोई भ्रम हुआ। मुझे बताएं कि क्या आपको सहायता की आवश्यकता है :)
गस ऑर्टिज़

@JMR मेरे ऐप की प्रकृति के कारण ऐसा हुआ कि एक सॉकेट एक से अधिक बार सब्सक्राइब हो गया, इसीलिए मुझे उस चेक को जोड़ना पड़ा।
गस ऑर्टिज़

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

किसी कारण से, वे सॉकेट आईडी स्टोर करने के लिए एक सरणी के बजाय एक सादे ऑब्जेक्ट का उपयोग कर रहे हैं।


यह काम करता है। Io.of ('') में एक खाली स्ट्रिंग नेमस्पेस के बिना काम करती है।
किर्ली इस्तवान

@ KirályIstván मैंने अभी कुछ समय तक इस पर ध्यान नहीं दिया है, लेकिन मुझे लगता है कि आप of()उस मामले में जंजीर कॉल को पूरी तरह से हटा सकते हैं ।
rppc

1

क्लस्टर मोड के लिए, रेडिस-एडेप्टर का उपयोग करना

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

});

जैसा कि प्रत्येक सॉकेट अपने आप में एक कमरा होता है, इसलिए कोई ढूंढ सकता है कि क्या सॉकेट उसी का उपयोग करके मौजूद है।


0

ईएस 6 जनरेटर का उपयोग करते हुए एक नाम स्थान से कनेक्ट सॉकेट्स के हैश को सरणी में बदलने का एक त्वरित तरीका है (सॉकेट पर लागू होता है> = 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

यदि प्रोजेक्ट में सॉकेट.आईओ क्लस्टर है तो इसका मतलब सॉकेट है।आईओ-रेडिस एडेप्टर का उपयोग किया जा रहा है।

इसके बाद के संस्करण की तरह मामले, हो रही सभी जुड़ा सॉकेट आईडी प्रक्रिया के माध्यम से लागू किया जाना चाहिए, तो socket.io-Redis अनुकूलक। इसके लिए नीचे दिए गए उदाहरणों का उपयोग किया जा सकता है;

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

मैंने सॉकेट के सरणी को कनेक्ट करने के लिए Object.Keys का उपयोग किया। फिर वस्तुओं के एक नए सरणी का निर्माण करने के लिए मानचित्र फ़ंक्शन के साथ एक ही सरणी में पुनरावृति

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
यह अच्छा होगा यदि आप कुछ संदर्भ जोड़ सकते हैं कि 'यह सबसे अच्छा तरीका क्यों है' और कैसे आपका जवाब ऊपर के सभी उत्तरों में से कुछ को जोड़ता है। कोड कुछ है, लेकिन एक उत्तर में भी कुछ स्पष्टीकरण होना चाहिए। जैसा कि आप देख सकते हैं कि इस प्रश्न के कई अन्य उत्तर हैं। आपके उत्तर को विषय में कुछ और लाना होगा, अन्यथा, यह बेमानी है।
नाथन रिपर्ट

के साथ socket.io 2.1.1 , मुझे लगता है TypeError: clients.map is not a functionऔर यद्यपि यह आशाजनक लग रहा है, मुझे पूरी तरह से यकीन नहीं है कि उपरोक्त उदाहरण क्या प्राप्त करेगा - मैं उम्मीद कर रहा था कि इसमें उपयोगकर्ता नाम के साथ स्वचालित रूप से क्लाइंट ऑब्जेक्ट की एक सरणी बनाई जाएगी :)।
user1063287
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.