【问题标题】:Joining socket io room on connect在连接时加入套接字 io 房间
【发布时间】: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');
});

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

【问题讨论】:

标签: javascript node.js socket.io


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-11-12
    • 2016-02-06
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多