[英]How to emit an array that updates across connected clients with socket.io
[英]how to Get all connected clients in socket.io
我有 socket.io v2.3,我正在嘗試從不同的文件中獲取所有連接的 sockets。 這是我的設置:
const io = require('socket.io');
let IO;
let myNameIO;
module.exports = {
create: (server) => {
IO = io(server, { cors: { origin: '*' } });
const redisConnection = redisAdapter({ host: redisHost, port: redisPort });
IO.adapter(redisConnection);
IO.on('connection', (socket) => {
console.log('a user connected');
});
IO.on('disconnect', (socket) => {
console.log('disconnected');
});
myNameIO = IO.of('/my-name');
myNameIO.on('connection', function (socket) {
console.log('someone connected');
});
},
getIO: () => IO,
getMyNameIO: () => myNameIO,
};
在 diff 文件中,我導入getMyNameIO
並嘗試獲取所有已連接的客戶端,但我遇到了麻煩。 試過做
getMyNameIO().clients((error, clients) => {
console.log(clients, '-=--=-=');
});
但客戶不是 function。然后我嘗試導入 socket.io 和 use.of,但沒有返回任何內容。 哪里做錯了,我該如何解決?
試試這個。 我懷疑是 scope 問題或操作順序問題。 無論哪種方式,這都應該解決它或給你一個更有用的錯誤。 我試圖維護您的命名方案,這讓我有點頭疼。 =)
const io = require('socket.io');
const socketServer = {
_initialized: false,
_myNameIO: null,
_IO: null,
_myNameIOClients: new Map(),
get myNameIO() {
if (!socketServer._initialized) throw new Error('socketServer.create not called!')
return socketServer._myNameIO
},
get IO() {
if (!socketServer._initialized) throw new Error('socketServer.create not called!')
return socketServer._IO
},
create: (server) => {
IO = io(server, { cors: { origin: '*' } });
const redisConnection = redisAdapter({ host: redisHost, port: redisPort });
IO.adapter(redisConnection);
IO.on('connection', (socket) => {
console.log('a user connected');
});
IO.on('disconnect', (socket) => {
console.log('disconnected');
});
myNameIO = IO.of('/my-name');
myNameIO.on('connection', function (socket) {
console.log('someone connected');
socketServer._myNameIOClients.set(socket.id, socket)
});
},
//getIO: () => IO,
//getMyNameIO: () => myNameIO,
getIO: () => socketServer._IO,
getMyNameIO: () => socketServer._myNameIO,
get myNameIOClients() {
return socketServer._myNameIOClients
},
getClients: () => new Promise((resolve,reject)=>socketServer._myNameIO.clients((error, clients)=> error ? reject(error) : resolve(clients))
}),
};
module.exports = socketServer
當我做 console.log(socketServer.myNameIO.sockets); 我得到一個 object 和所有 sockets。我怎樣才能得到一個數組?
查看 API https://socket.io/docs/v2/server-api/#Namespace
我沒有看到對 Namespace.sockets 的引用。 這並不意味着它不存在。 我添加了一個 getClients function,它將返回一個客戶端 ID 數組。
const socketServer = require('./socketServer ')
socketServer.getClients()
.then(clients=>{
// clients an array of client IDs
})
.catch(e=>console.error('Error is socketServer.getClients()', e))
我認為您真正想要的是管理連接。 一種方法是在連接進入時對其進行映射。
const socketServer = require('./socketServer ')
// This is a Map
let myNameIOClients = socketServer.myNameIOClients
// We can easily turn it into an array if needed
let myNameIOClientsArray = Array.from(socketServer.myNameIOClients)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.