连接时加入 Socket IO 房间

35

我正在尝试让已登录的用户在连接时加入特定的socket.io房间。根据我在网上找到的任何示例,我似乎必须从客户端发出一些操作才能加入某个房间。类似于:

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

服务器.js:

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

根据大多数教程的说法,它应该可以正常工作。

我想要做的是:

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

但是好像没有起作用,因为无论我从服务器发送什么消息都无法在客户端接收到。你有什么想法,我做错了什么吗?总的来说这种情况可能发生吗?


1
请查看https://dev59.com/K2Ik5IYBdhLWcg3wku9n。 - sova
你需要在服务器端加入,而不是客户端。 - Beginner
3个回答

64

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

服务器:

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

客户端:

socket.emit('join', roomNum);

如何添加已注册用户? - teenage vampire

44

客户端没有 .join() 方法。房间仅是服务器端的构建,客户端对其一无所知。

您的第一个代码块是期望执行事项。您向服务器发送自己设计的消息,请求将套接字加入房间,并在服务器端执行 .join()


谢谢!直到现在我对流程有了不同的理解 :) - Karma Blackshaw

12

这很容易实现。您只需要传递一个服务器能够理解的查询参数即可。

以下示例并未完全测试,但这个想法是可行的。在此示例中,房间名称是从客户端的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);
});

5
这是一个好的答案,因为有人可以欺骗引荐头,而欺骗窗口 href 更加困难,而且您不必提交额外的 emit(),这可能会像其他答案一样带来流失的风险。这里是相关文档的链接 [reference] (https://socket.io/docs/client-api/#With-query-parameters)。 - soulshined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接