连接插座io房间连接

Ark*_*dyB 16 javascript node.js socket.io

我试图让登录用户加入连接上的某个socket.io房间.根据我在网上发现的任何例子,我似乎已经从客户端发出一些动作,以便能够加入一些房间.就像是:

socket.on('connect', function() {
   socket.emit('join', 'room1');
});
Run Code Online (Sandbox Code Playgroud)

Server.js:

io.sockets.on('connection', function(socket) {
    socket.on('join', function(room) {
        socket.join(room);
    });
});
Run Code Online (Sandbox Code Playgroud)

根据大多数教程,它应该工作.

我认为要做的是:

socket.on('connect', function() {
   socket.join('room1');
});
Run Code Online (Sandbox Code Playgroud)

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

Bk *_*zor 17

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

服务器:

  io.sockets.on('connection', function(socket) {
    socket.on('join', function(room) {
    socket.join(room);
    });
});
Run Code Online (Sandbox Code Playgroud)

客户:

 socket.emit('join', roomNum);
Run Code Online (Sandbox Code Playgroud)


jfr*_*d00 16

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

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


Gur*_*sad 9

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

下面的例子没有经过全面测试,但这个想法会奏效。在此示例中,房间名称是根据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,
    },
});
Run Code Online (Sandbox Code Playgroud)

服务器

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);
});
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,因为有人可以欺骗引用标头,欺骗窗口 href 更困难,并且您不必提交额外的 emmit() ,这会像其他答案一样带来下降的风险。这是关于它的文档[参考](https://socket.io/docs/client-api/#With-query-parameters) (5认同)