socket.join 不起作用(socket.io)

Posted

技术标签:

【中文标题】socket.join 不起作用(socket.io)【英文标题】:socket.join does not work (socket.io) 【发布时间】:2017-09-16 08:19:35 【问题描述】:

所以,我的 socket.join 调用什么也没做。调用socket.join,然后列出socket所在的房间后,socket只连接到由它的id定义的房间(它自己的房间)。

function onJoin(room) 
    console.log("Joining room: " + room);
    socket.join(room);
    console.log(socket.id + " now in rooms ", socket.rooms);

例如会打印:

> Joining room: 5aba92759b9ffa9fdf579714d6aa125ddb05cb1172611331775e7a69dab37258
> Q6D4h17DvdOZrbrEAAAC now in rooms   Q6D4h17DvdOZrbrEAAAC: 'Q6D4h17DvdOZrbrEAAAC' 

如果有什么不同,下面是我的套接字服务器的创建方式:

//app.js
var app = express();
var http = require('http');
var server = http.Server(app);
var io = require('socket.io')(server);
var chat = require('./routes/chat/chat')(io);

//chat.js
module.exports = function(io) 
  io.sockets.on('connection', function(socket) 

    socket.on('join', onJoin);
    ...

问题出在哪里?

Socket.io v1.7.3

【问题讨论】:

【参考方案1】:

问题是socket.join 是异步的。所以这将按预期工作:

socket.join(room, function() 
  console.log("Socket now in rooms", socket.rooms);
);

【讨论】:

【参考方案2】:

在新版本中,将函数作为第二个参数添加到 .join() 方法已被删除, 您可以使用异步等待。

例子

await socket.join(room_Name);
io.to(room_Name).emit(emit_Name);

【讨论】:

【参考方案3】:

使用:io.sockets.adapter.rooms

function onJoin(room) 
     console.log("Joining room: " + room);
     socket.join(room);
     console.log(socket.id + " now in rooms ", getRoomsByUser(socket.id));


function getRoomsByUser(id)
    let usersRooms = [];
    let rooms = io.sockets.adapter.rooms;

    for(let room in rooms)
        if(rooms.hasOwnProperty(room))
            let sockets = rooms[room].sockets;
            if(id in sockets)
                usersRooms.push(room);          
        
    

    return usersRooms;

加入'test'后你会看到这样的:

AEi6eIlkutIcm_CwAAAB now in rooms test,AEi6eIlkutIcm_CwAAAB

【讨论】:

【参考方案4】:

对于使用 v3.0 的任何人,从 socket.IO 版本 3.0 开始,join 不再是异步的,上面的代码应该可以正常工作。 see here

【讨论】:

以上是关于socket.join 不起作用(socket.io)的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信

socket.io多房间聊天

Socket.io 中的动态房间

如何获取房间中的socket.io客户端数量?

Socket I/O模型之select模型

Socket IO Rooms:获取特定房间的客户端列表