在连接时加入套接字 io 房间

Posted

技术标签:

【中文标题】在连接时加入套接字 io 房间【英文标题】:Joining socket io room on connect 【发布时间】:2017-03-15 01:06:49 【问题描述】:

我正在尝试让登录用户在连接时加入某个 socket.io 房间。 根据我在网上找到的任何示例,我似乎已经从客户端发出了一些动作,以便能够加入某个房间。 类似的东西:

socket.on('connect', function() 
   socket.emit('join', 'room1');
);

Server.js:

io.sockets.on('connection', function(socket) 
    socket.on('join', function(room) 
        socket.join(room);
    );
);

根据大多数教程,它应该可以工作。

我想做的是:

socket.on('connect', function() 
   socket.join('room1');
);

但它似乎不起作用,因为我从服务器发出的任何消息都没有被客户端捕获。任何想法,我做错了什么?一般可以吗?

【问题讨论】:

查看***.com/questions/19150220/… 你在服务器端而不是在客户端加入 【参考方案1】:

这应该是你需要的。随意通过客户传递您想要的任何房间名称。只有服务器可以处理将套接字分配给房间。

服务器:

io.sockets.on('connection', function(socket) 
        socket.on('join', function(room) 
        socket.join(room);
    );
);

客户:

socket.emit('join', roomNum);

【讨论】:

【参考方案2】:

客户端没有.join() 方法。房间纯粹是服务器端的构造,客户端对它们一无所知。

您的第一个代码块是做事的理想方式。您向服务器发送一条您设计的消息,要求它将套接字加入房间,然后在服务器端执行.join()

【讨论】:

谢谢!到目前为止,我对流程有不同的理解:)【参考方案3】:

这很容易实现。您需要做的就是传递一个服务器可以理解的查询参数。

以下示例尚未经过全面测试,但该想法可行。在本例中,房间名称是根据客户端上的window.location.href 确定的。

客户

// Last segment of path is roomName
var roomName = window.location.href.substr(window.location.href.lastIndexOf('/') + 1);
var socket = io(
    query: 
        roomName: roomName,
    ,
);

服务器

var io = require('socket.io')(server);
io.on('connection', function(socket) 
    var query = socket.handshake.query;
    var roomName = query.roomName;
    if(!roomName) 
        // Handle this as required
    
    socket.join(roomName);
);

【讨论】:

这是一个很好的答案,因为有人可以欺骗引荐来源标头,欺骗窗口 href 更难,而且您不必提交额外的 emit() 会带来掉线的风险像其他答案一样关闭。这是上面的文档reference

以上是关于在连接时加入套接字 io 房间的主要内容,如果未能解决你的问题,请参考以下文章

套接字 io 不向房间发送消息

在 redis 订阅事件发生后,如何加入套接字 io 房间?

如何在Socket.IO中一次性离开套接字连接的所有房间[关闭]

Socket.io 不会在断开连接时向房间发送消息

( Socket.io ) 一个socket连接多个房间

在 NestJs 中使用 Socket IO 加入和发射到房间