【问题标题】:Why does socket.io not join a given room?为什么 socket.io 不加入给定的房间?
【发布时间】:2019-01-16 14:47:39
【问题描述】:

我在尝试将套接字连接到房间时遇到问题。房间的名称是socket.id,它是在连接时分配的。但是当这种情况发生时,它不会加入房间。可能是什么错误?

客户端代码:

var socket = io();

socket.on("connect", function() {
    socket.emit("joinRoom", socket.id);
});

socket.on("agentMessage", function(msg) {
    $('#messages').append("<div class='agent-messages'><p>" + msg + "</p></div>");
});

服务器代码:

io.on("connection", (socket) => {
   let roomID;

    socket.on("joinRoom", (socket_id) => {
        roomID = socket_id;
        socket.join(roomID);
        socket.to(roomID).emit("agentMessage", "Welcome!");
    });

    socket.on("disconnect", () => {
        socket.leave(socket_id);
    });
});

【问题讨论】:

  • 如果您的代码不仅仅是一个示例,我还想指出 socket.io 已经根据他们的套接字 ID 将每个用户添加到房间!因此,如果您需要另一个命名房间,问题/答案仍然有效,但如果您快速尝试向一个用户发送消息,只需使用:io.to(socket.id).emit("hello!");或者在这种特定情况下:io.to(socket.id).emit("agentMessage", "Welcome!");希望这对某人有帮助:)

标签: node.js socket.io


【解决方案1】:

您的client 实际上加入了room,但并未发送message。当您从server 端发送message 时,您不能使用socket 发送它,因为socket 代表client 连接并且不能代表server 抛出events。你必须使用

  io.to(roomID).emit("agentMessage", "Welcome!");

因为 io 代表一个服务器实例,可以代表服务器抛出事件(实际上是服务器)。

Reference

【讨论】:

  • 谢谢老兄,这就是问题所在!
  • 如果这解决了您的问题,请将答案标记为正确,以便对其他人也有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2017-05-12
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多