【问题标题】:Really with [socket.join(the_other_room);] the client join to other room?真的用 [socket.join(the_other_room);] 客户端加入到其他房间吗?
【发布时间】:2018-03-22 11:23:27
【问题描述】:

问候,以前我用以下方式创建了 rom "/other_room":

io.of('/other_room');

然后在我这样做之后:

socket.on('MessageFromClient_Change_Of_ROOM', function(msj){

// yes!, I validate var msj == '/other_room'


console.log('before: ' + socket.nsp['name']);
socket.join(msj);
console.log('after: ' + socket.nsp['name']);
}

但永远是我的控制台打印:

before: /
after: /

为什么这个套接字永远不会更改为“/other_room”???

谢谢

版本/添加:

这是我的“代码:

    var io = require('socket.io').listen(6969);
    io.sockets.on('connection', function(socket){
        clientes ++;
        server.sockets.emit('eventCONEX', clientes);
        // here my lines of code with "events" ...
        // then ALL "new connection" by default go into '/'...
        // then all "new connection" have assigned the namespace "/"
     });

请:我如何将用户从“此默认 [/]”传输/移动到“个性化”??

我有一群客户:A、B、C、E、...、Z

然后当我使用时:

        io.sockets.emit('My Event', the_info);

远程客户端的窗口浏览器,默认向所有连接到“/”或socket/room/namespace的客户端显示“the_info”。

我需要用户可以创建“Room_created_by_A”或“Room_created_by_B”...

我相信了指示:

socket.join(new_name);

方法是否正确,但现在我明白不正确。

然后当客户端发送消息“create_new_room”时,我运行以下行:

function list_of_rooms(){
    s = '';
    for(S in server.nsps)s += S + '\n';
    return s;
}

server.of(msj);
server.of(socket.nsp['name']).emit('F5_rooms', list_of_rooms());

我试试新解释:

当客户端 A 创建“房间”[thecnology] 时,我的代码/程序运行更新“list_of_rooms()”,然后一些客户端如 F、G、H 可以转到房间 [thecnology]。

然后因为组 {A,F,G,H} 进入房间 [thecnology],如果他们发送消息,只有组 {A,F,G,H} 收到消息,因为消息或“多播”只是为了客户进入[thecnology]。

我相信此消息/多播可以通过:

server.of(socket.nsp['name']).emit('new_message_to_this_group', message);

新,感谢帮助; (我相信也许没有授权说谢谢)

【问题讨论】:

  • 不清楚你在问什么。 io.of('/other_room'); 不会创建房间。这将为您提供一个命名空间对象,该对象允许您与连接到该特定命名空间的任何连接进行通信。与房间完全无关。您似乎混淆了房间和名称空间。它们是不同的东西。
  • 感谢您的帮助。当我运行时: for(S in server.nsps)console.log(S) 我看到“每个房间的名称”,只看到房间'/'和其他......就像说socket.io/docs/rooms-and-namespaces(我们称默认命名空间/和...)当然我错了,那么请任何帮助都是非常受欢迎的...哦!然后是socket.join(msj);创建 OTHER NAMESPACE,没有其他房间??
  • 您必须用文字解释您要完成的工作,然后我可能会向您展示正确的代码。但是您需要清楚地描述您要完成的工作并编辑您的问题以说明这一点。
  • 非常感谢您的耐心等待。我相信知道 {socket.id} 是每个客户端的 id...然后如果我有 10 个客户端连接,并且 [room] 默认为“/”(socket.io/docs/rooms-and-namespaces)我喜欢一些客户端创建其他 [room]名称与“/”不同,然后是任何 {socket.id} 转到“new_room”,然后如果任何客户端向“new_room”发送消息,只有 {socket.id} 连接到“new_room”才能接收发送到“new_room”的消息”。 (我相信该消息是通过 io.of(socket.nsp['name']).emit('event', msj); 发送的;最近感谢。
  • 你有反对票和接近票。请解决您的问题,因为我已多次建议您避免获得更多反对票并避免关闭您的问题。你现在写的问题不清楚,需要修复才能清楚。这就是堆栈溢出的工作原理。这里只允许提出好的、清晰的、主题相关的问题。如果您收到反馈说您的问题不清楚,您需要立即解决。

标签: node.js socket.io


【解决方案1】:

您将命名空间与房间完全混淆了。它们是两个完全不同的东西,要使用房间,你不需要对命名空间做任何事情。要将客户端套接字放入房间,请在服务器上使用该特定客户端的套接字执行此操作:

socket.join("someRoom");

然后,要从服务器向该房间中的每个人发送消息,请执行以下操作:

io.in("someRoom").emit("msg", "Hello to all");

如果您想使用 MessageFromClient_Change_Of_ROOM 消息加入房间,您可以这样做:

io.on('connection', function(socket) {
    socket.on('MessageFromClient_Change_Of_ROOM', function(msj){
        // assumes client is only supposed to be in one room
        // and keeps track of prior room in socket.priorRoom
        if (socket.priorRoom) {
           // leave previous room
           socket.leave(socket.priorRoom);
        }
        // join new room
        socket.join(msj);
        socket.priorRoom = msj;
    });
});

【讨论】:

  • 这是我的“代码:var io = require('socket.io').listen(6969); io.sockets.on('connection', function(socket){ clientes ++; io.sockets.emit('eventCONEX', clientes); // here my lines of code with "events" ... // then ALL "new connection" by default go into '/'... // then all "new connection" have assigned the namespace "/" 请:我如何将用户从默认传输/移动到“个性化”??
  • @VyR - 多行代码在 cmets 中不可读。使用“编辑”按钮将其添加到您的问题中,然后发表评论告诉人们您编辑了您的问题。另外,请使用编辑按钮将您尝试做的事情的描述也放入您的问题中。这里的问题需要讲清楚,大家才能理解。糟糕的问题会被否决或关闭——这是使这个问答网站比互联网上的许多问答网站质量更高的部分原因,因为会员监督问答的质量。您需要在此处遵循正确的程序。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多