在连接时加入套接字 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 房间的主要内容,如果未能解决你的问题,请参考以下文章
在 redis 订阅事件发生后,如何加入套接字 io 房间?