Socket.IO - làm thế nào để tôi có được danh sách các socket / client được kết nối?


158

Tôi đang cố gắng để có được một danh sách tất cả các ổ cắm / máy khách hiện đang được kết nối.

io.sockets không trả về một mảng, thật không may.

Tôi biết tôi có thể giữ danh sách của riêng mình bằng cách sử dụng một mảng, nhưng đừng nghĩ rằng đây là một giải pháp tối ưu vì 2 lý do:

  1. Dư. Socket.IO đã giữ một bản sao của danh sách này.

  2. Socket.IO cung cấp phương thức để đặt các giá trị trường tùy ý cho các máy khách (ví dụ socket.set('nickname', 'superman'):) vì vậy tôi cần theo kịp các thay đổi này nếu tôi muốn duy trì danh sách của riêng mình.

Cứu giúp?


Bạn có thể chuyển đổi io.sockets thành một mảng không?
mak

2
Trong 0.7.6 io.sockets.sockets là một đối tượng băm đơn giản id => socket
mak

1
Tôi nhận thấy điều đó, nhưng nó đang hành động kỳ lạ (dường như không giống như các đối tượng ổ cắm tiêu chuẩn). Ví dụ tôi đã thử: pastebin.com/fxuzVckS nhưng nó nói rằng đối tượng socket không chứa phương thức 'get'.
Andy Hin

3
socketlà id, io.sockets.sockets[socket]là ổ cắm.
mak

2
Đối số đầu tiên là errvà nếu bạn đang sử dụng bộ nhớ lưu trữ thì nó luôn luôn null. .get('nickname', function(err, nickname) { ... })
mak

Câu trả lời:


173

Trong Socket.IO 0.7 bạn có một clientsphương thức trên các không gian tên, điều này trả về một mảng của tất cả các ổ cắm được kết nối.

API không có không gian tên:

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

Đối với một không gian tên

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

Hy vọng điều này sẽ giúp ai đó trong tương lai

LƯU Ý: CHỈ Giải pháp này hoạt động với phiên bản trước 1.0


CẬP NHẬT 2020 Mar 06

Từ 1.x trở lên, vui lòng tham khảo liên kết này: nhận được bao nhiêu người trong một phòng trò chuyện trong socket.io


3
Tôi nghĩ rằng họ đã bỏ phương thức máy khách trong 1.0 ... chỉ cần kiểm tra xem tại thời điểm này ...
marksyzm

7
Họ đã bỏ gần như mọi thứ trong 1.0 vì nó được viết lại hoàn chỉnh. Nhưng như 1.0 đã không được phát hành trong nhiều năm. Trong 1.0, bạn phải sử dụng connectedđối tượng của không gian tên.
Thứ

6
@ 3rdEden, cú pháp sử dụng đối tượng được kết nối của không gian tên là gì? var clients = io.sockets.connected();rõ ràng là không hoạt động. Cảm ơn
Kaya Toast


LoạiError: fn.bind không phải là một chức năng
Iman Marashi

100

Ổ cắm.io 1.4

Object.keys(io.sockets.sockets); cung cấp cho bạn tất cả các ổ cắm được kết nối.

Socket.io 1.0 Kể từ socket.io 1.0, câu trả lời được chấp nhận thực tế không còn hợp lệ nữa. Vì vậy, tôi đã thực hiện một chức năng nhỏ mà tôi sử dụng như là một sửa chữa tạm thời:

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 cho Không có không gian tên trở thành

// 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 cho một không gian tên trở thành:

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

Cũng xem câu hỏi liên quan này , trong đó tôi đưa ra một hàm trả về các ổ cắm cho một phòng nhất định.

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

Ổ cắm.io 0,7

API không có không gian tên :

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

Đối với một không gian tên

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

Lưu ý: Vì có vẻ như API socket.io dễ bị phá vỡ và một số giải pháp dựa trên chi tiết triển khai, đây có thể là vấn đề tự theo dõi khách hàng:

var clients = [];

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

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

3
Cảm ơn vì điều này. Tôi ngạc nhiên khi họ lấy chức năng này ra.
Tyler Scott

1
@TylerScott Tôi cũng vậy, đặc biệt là điều này không có trong hướng dẫn di chuyển của họ (trừ khi tôi thiếu một cái gì đó). socket.io/docs/migrating-from-0-9
nha

@nha, điều này không phù hợp với tôi nhưng trả về một loạt các Số nguyên, như 0, 1 và 2, v.v. thay vì một mảng các ổ cắm. Có ý kiến ​​gì không?
ThePixelPony

Làm thế nào về nhiều nút? bởi vì tôi sử dụng nhiều nút với cửa hàng redis
John Nguyen

3
@nha bạn trả lời là chính xác, nhưng nó không hoạt động cho nhiều nút với máy chủ cửa hàng redis. từ quá trình 1 nút, bạn không thể kiểm tra ổ cắm được kết nối hay không bằng cách sử dụng ns.connected [id]
John Nguyen

46

Sau socket.io 1.0, chúng tôi không thể sử dụng

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

nữa không. Thay vào đó bạn có thể sử dụng như sau

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
tôi đổi thànhvar clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Fábio Zangirolami

37

Sử dụng socket.IO 1.x:

Nhận mảng của các máy khách được kết nối:

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

Lấy số lượng khách hàng được kết nối:

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

32

Rất đơn giản trong socket.io 1.3:

io.sockets.sockets- là một mảng chứa các đối tượng ổ cắm được kết nối. Nếu bạn lưu tên người dùng trong mỗi ổ cắm, bạn có thể làm:

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

Bùng nổ. Bạn có tên của tất cả người dùng được kết nối.


2
Cảm ơn! +1 cho đơn giản. Bạn có biết nếu có bất kỳ sự khác biệt giữa phương pháp này và, giả sử, câu trả lời của Joseph Dykstra? (Object.keys(io.engine.clients)
xe đạp Nhà ngôn ngữ học

4
Điều này không hoạt động trên v1.4.5. Vẫn đang nghiên cứu giải pháp
Nuno Furtado

bạn có tìm thấy nó không? \
ocram

2
LoạiError: io.sockets.sockets.map không phải là một chức năng
Király István

23

Tôi đã trải qua nỗi đau này ngày hôm nay. Socket.io sẽ tốt hơn nhiều nếu họ có thể tạo một tài liệu phù hợp cho API của mình.

Dù sao, tôi đã cố gắng xem xét io.sockets và tìm thấy một số tùy chọn chúng ta có thể sử dụng:

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

Ngoài ra, lưu ý rằng khi sử dụng socket.io với không gian tên, các phương thức trên sẽ bị hỏng do io.sockets trở thành một mảng thay vì một đối tượng. Để giải quyết, chỉ cần thay thế io.sockets bằng io (tức là io.sockets.connected trở thành io.connected, io.sockets.ad CHƯƠNG.rooms trở thành io.ad CHƯƠNG.rooms ...)

Đã thử nghiệm trên socket.io 1.3.5


1
@ Елёный Nó sẽ hoạt động nếu bạn không sử dụng không gian tên. Nếu bạn đang sử dụng không gian tên, hãy đổi thành io.server.eio.clentsCount
Thanh Nguyen

2
Có, tài liệu chính thức có thể được cải thiện rất nhiều
CodeAndCats

18

Phiên bản +2.0

Trong phiên bản +2.0, bạn chỉ định không gian tên / phòng / nút mà bạn đang truy vấn.

Cũng như phát sóng, mặc định là tất cả các máy khách từ không gian tên mặc định ('/'):

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

Nhận danh sách ID khách hàng được kết nối với không gian tên cụ thể (trên tất cả các nút nếu có).

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

Một ví dụ để có được tất cả các khách hàng trong phòng của không gian tên:

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

Đây là từ tài liệu chính thức: Socket.IO Server-API


1
Có cách nào để xem tất cả các đối tượng ổ cắm ? ví dụ: nếu tôi thêm một thuộc socket.usernametính cho mỗi ổ cắm khi kết nối, có cách nào tôi có thể xem tất cả các đối tượng ổ cắm này (bao gồm các thuộc tính tùy chỉnh tôi thêm vào mỗi ổ cắm) không? (để tham khảo, tôi hiện đang sử dụng biến đối tượng toàn cầu để lưu trữ thông tin ổ cắm bổ sung khi máy khách kết nối - vì vậy không hỏi cách thiết lập nó - chỉ quan tâm đến việc có cách nào để xem tất cả các đối tượng ổ cắm theo 'mặc định') .
dùng1063287

1
hmm, mỗi câu trả lời này , tôi nghĩ bạn có thể xem tất cả ổ cắm kết nối với console.log(io.sockets.connected)- nó có vẻ là một đối tượng trong đó mỗi giá trị tài sản là một "đối tượng socket", trong đó có các đặc tính này nsp, server, adaptor, id(một string), client, conn, rooms, acks, connected, disconnected, handshake, fns, flags, _rooms, _events, _eventsCountvà cuối cùng usernameđó là tài sản tùy chỉnh i thêm vào mỗi ổ cắm trên kết nối.
dùng1063287

17

Tôi nghĩ rằng chúng ta có thể truy cập đối tượng socket từ máy chủ và bạn có thể gán tên hiệu và trỏ id socket của nó,

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

Trên disconnectxin vui lòng xóa tên hiệu từ io.sockets.sockets.


mục đích của 'client.on' là gì? Bạn có thể sử dụng mã của mình như thế này (chỉ chấp nhận dữ liệu từ 1 ổ cắm) không?
Hawk

9

Đây là cách tốt nhất để truy cập nó trong socket.io 1.3

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


xin vui lòng để tôi chia sẻ ví dụ này, 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

Đối với bất kỳ ai chỉ muốn có một số khách hàng được kết nối, tôi tin rằng điều này sẽ làm được:

io.sockets.manager.server.connections


không phải là số lượng khách hàng được kết nối, thử nghiệm. (thêm một chút)
mrzmyr

5
để có được số lượng sử dụng chính xácio.sockets.clients().length
Ivo

2
Hiện tại cả hai io.sockets.manager.server.connectionsio.sockets.clients().lengthkhông hoạt động. Điều này làm việc cho tôi - Chỉ tính - io.engine.clientsCountvà cho danh sách khách hàng - io.engine.clientsCount. Vì nó đã ở cách này trong hơn 3 năm. Có vẻ như một cách đáng tin cậy để có được thông tin kết nối. (Dựa trên câu trả lời của Joseph Dykstra)
Aswin Ramakrishnan

5

Ổ cắm.io 1.4.4

Mã mẫu cho bạn.

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

Tôi nghĩ rằng sẽ giúp ai đó khối mã này.


4

Trong socket.IO 1.4

Để có được mảng của tất cả người dùng được kết nối:

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

Để có được số lượng của tất cả các khách hàng:

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

Tôi xác nhận rằng tính năng này hoạt động trong phiên bản 1.5.1 của socket.io
Sébastien

3

Kể từ socket.io 1.5, lưu ý thay đổi từ indexOf dường như không được khấu hao và được thay thế bằng valueOf

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

Đối với socket.io phiên bản 2.0.3, đoạn mã sau hoạt động:

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

bạn không thể tưởng tượng được bạn đã cứu tôi bao nhiêu đau đớn
nicholaswmin

nhưng phiên bản socket.io chưa 1.5! Bây giờ là 1.4.8
leszek.hanusz

@MoleIsKing Obrigado amigo!

2

trên socket.io 1.3 tôi đã hoàn thành việc này trong 2 dòng

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

2

Ổ cắm.io 1.7.3 (+):

hàm getConnectedList ()
{
    hãy để danh sách = []
    
    cho (cho phép khách hàng trong io.sockets.connected)
    {
        list.push (khách hàng)
    }
    
    danh sách trả lại
}

console.log (getConnectedList ())

// trả về ['y Ifhb2tw7mxgrnF6AAAA', 'qABFaNDSYknCysbgAAAB']


2

Đối với phiên bản 2.3, nó cũng hoạt động và nó cũng sẽ mang lại cho bạn ổ cắm , đối với tôi, socketIo đang thay đổi quá nhanh và nhiều tài liệu có thể đọc được sau khi sử dụng một thời gian.

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

Tuy nhiên, điều này vẫn không đúng, vì tôi luôn có cảm giác này với socket Io bằng cách nào đó


1
Tôi bắt đầu nghĩ rằng đó là một thư viện rác. điều duy nhất là nó chuyển ngay lập tức nhiều loại dữ liệu (json, nhị phân, v.v.) nếu không toàn bộ kiến ​​trúc là tào lao và không vượt quá 1 trên 1 ứng dụng trò chuyện
Muhammad Umer

1

Tôi tin rằng bạn có thể truy cập này từ tài sản người quản lý của socket?

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

Câu trả lời của 2ndEden không có tác dụng với tôi vì có vấn đề với mảng trả về các máy khách bị ngắt kết nối, làm mất tính. Object.keys (io.manager.open) .length hóa ra là số lượng đáng tin cậy nhất trong kinh nghiệm của tôi. io.of ('/ không gian tên'). manager.open nếu bạn đang sử dụng không gian tên.
Wes Johnson

1

Tôi thấy rất nhiều câu trả lời hay ở đây và nhiều nơi khá hữu ích nhưng không hoàn toàn là những gì tôi cần. Tôi đang sử dụng các socket cho tính năng pubsub trong đó một khách hàng quan tâm có thể lắng nghe bất kỳ thay đổi nào trong một bản ghi đã cho.

Vấn đề cụ thể của tôi là cùng một ổ cắm đã tham gia cùng một phòng nhiều lần. Giải pháp cho vấn đề này là kiểm tra xem ổ cắm đã có phòng trong tài sản phòng chưa.

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

Hy vọng điều này sẽ giúp được ai đó.


Tôi nghĩ rằng có thể tránh tuyên bố 'nếu' đó, nếu bạn khiến khách hàng tham gia phòng khi kết nối ổ cắm.
Chayemor

MyObj đến từ đâu? Làm thế nào bạn đạt đến giá trị đó?
Michael Draper

@MikeDraper myObject là bản ghi trong cơ sở dữ liệu hoạt động như một kênh. Điều này giải quyết là trường hợp bạn muốn tất cả các máy khách của mình được cập nhật mỗi khi có thay đổi trong cơ sở dữ liệu, ví dụ người dùng cập nhật tên của nó và tất cả các máy khách được kết nối sẽ nhận được bản cập nhật. Vì vậy, tôi tạo một phòng cho id cá thể đó, với điều kiện là nó là duy nhất (BSON). Đó là một giá trị rất cụ thể cho trường hợp sử dụng của tôi, vì vậy tôi xin lỗi Nếu tôi gây ra bất kỳ sự nhầm lẫn nào. Hãy cho tôi biết nếu bạn cần giúp đỡ :)
Gus Ortiz

@JMR do tính chất của ứng dụng của tôi, nó đã xảy ra rằng một ổ cắm đã đăng ký nhiều lần, đó là lý do tại sao tôi phải thêm kiểm tra đó.
Gus Ortiz

1

Đây là cách đơn giản nhất trong Socket.IO 1.0+, nếu bạn không sử dụng không gian tên hoặc phòng.

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

Cái này nhìn vào không gian tên mặc định và xác định độ dài của mảng socket, mà không cần sử dụng Object.keys()


1

Kể từ phiên bản 1.5.1, tôi có thể truy cập tất cả các ổ cắm trong một không gian tên với:

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

Vì một số lý do, họ đang sử dụng một đối tượng đơn giản thay vì một mảng để lưu trữ ID ổ cắm.


Cái này hoạt động. Một chuỗi rỗng trong io.of ('') hoạt động mà không có không gian tên.
Király István

@ KirályIstván Tôi đã không xem xét điều này một thời gian, nhưng tôi nghĩ bạn có thể loại bỏ hoàn toàn of()cuộc gọi bị xích trong trường hợp đó.
rppc

1

Đối với chế độ cụm, sử dụng redis-adapter

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

});

Vì mỗi ổ cắm là một căn phòng, vì vậy người ta có thể tìm thấy liệu một ổ cắm có tồn tại bằng cách sử dụng như nhau không.


0

Dưới đây là một cách nhanh chóng để chuyển đổi hàm băm của các socket được kết nối từ một không gian tên thành một mảng bằng cách sử dụng các trình tạo ES6 (áp dụng cho socket.io> = 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

Tôi không biết nếu điều này vẫn còn. Nhưng một cái gì đó như thế này là những gì tôi đã kết thúc bằng cách sử dụng (Tôi giữ một đối tượng phiên trên mỗi ổ cắm được kết nối, lần lượt chứa tên người dùng và thông tin khác:

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

0

Nếu dự án có cụm socket.io, điều này có nghĩa là bộ điều hợp socket.io-redis đang được sử dụng.

Nếu trường hợp như trên, nhận được tất cả quá trình id ổ cắm được kết nối phải được áp dụng thông qua bộ điều hợp socket.io-redis . Các ví dụ dưới đây có thể được sử dụng cho việc này;

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

Vui lòng truy cập trang github của socket.io-redis để biết thêm chi tiết.


0

ổ cắm.io@1.7.3

Tôi đã sử dụng Object.Keys để kết nối mảng ổ cắm. Sau đó, trong cùng một mảng lặp với chức năng ánh xạ để xây dựng một mảng các đối tượng mới

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

Có lẽ câu trả lời này có thể giúp để có được mảng id / tên người dùng.


1
Xin chào - bạn có thể vui lòng giải thích bằng tiếng Anh cách khắc phục sự cố này không? Bằng cách này, nó sẽ không chỉ là một câu trả lời chỉ có mã. Cảm ơn!
Max von Hippel

0

câu 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
Sẽ tốt hơn nếu bạn có thể thêm một số bối cảnh tại sao 'Đây là cách tốt nhất' và cách câu trả lời của bạn thêm bất cứ điều gì vào tất cả nhiều câu trả lời ở trên. Mã là một cái gì đó, nhưng một câu trả lời cũng nên có một số lời giải thích. Như bạn có thể thấy có nhiều câu trả lời khác cho câu hỏi này. Câu trả lời của bạn phải mang lại một cái gì đó nhiều hơn cho chủ đề, nếu không, nó là dư thừa.
Nathan Ripert

Với socket.io 2.1.1 , tôi nhận được TypeError: clients.map is not a functionvà mặc dù có vẻ đầy hứa hẹn, tôi không hoàn toàn chắc chắn những gì ví dụ trên sẽ đạt được - tôi đã hy vọng nó sẽ tự động tạo ra một mảng các đối tượng khách hàng có tên người dùng :).
dùng1063287
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.