【问题标题】:Socket.IO emitting chat message to roomSocket.IO 向房间发送聊天消息
【发布时间】:2017-09-27 06:30:27
【问题描述】:

我目前在 socketio 中有一个系统,可以为个人消息创建房间:

  socket.on("chat message", function(msg) {
    var roomname;
    if (msg.recipient > msg.sender) {
        roomname = msg.sender + "-" + msg.recipient;
    }
    else {
        roomname = msg.recipient + "-" + msg.sender;
    }
    if(!io.sockets.adapter.sids[users[msg.sender]][roomname]) {
        socket.join(roomname);
    }
    var clients = io.sockets.adapter.rooms[roomname].sockets;
    console.log(clients);
    io.in(roomname).emit("chat message", msg);
});

if/else 语句基本上按字母顺序创建房间名称(person1-person2),以防止双方加入房间时混淆。如果套接字尚未在该房间中,则该套接字将加入该房间。这都是在服务器收到“聊天消息”时触发的。我已经确认插座室连接部分有效。但是,我似乎没有在客户端收到消息:

var socket = io();
socket.on("chat message", function(msg) {
    alert("received message");
    console.log(msg[message]);
    if (msg[message] != "") {
        $(".chat-history-div").append($("<li>").text(msg.message));
    }
});

我在发送消息时没有收到“已收到消息”警报。为什么是这样?为什么我没有收到来自服务器的消息?谢谢!

编辑: 这是我的客户端emit("chat message)

 var socket = io();
 $("#form-send-message").submit(function () {
     var messageDetails = {
        sender: "<%=currentUser.username%>",
        recipient: $(this).find("textarea").val(),
        message: $(this).find(".chat-message-input").val()
    }
    socket.emit("chat message", messageDetails);
    $(".chat-message-input").val("");
    return false;
});

【问题讨论】:

  • 你能告诉我们你的客户端emit("chat message")吗?如果这是真的,我没有看到提供的代码有任何问题:我已确认套接字室连接部分有效
  • 浏览器的开发者控制台是否显示错误?
  • 你得到console.log(clients)的输出了吗?我认为当您尝试在房间中查找客户端数量并且代码未执行时会出现错误尝试在该行之后放置另一个 console.log() 并检查输出
  • @MarcosCasagrande 我添加了客户端聊天消息发出
  • @MehulPrajapati 我将console.log(clients) 移到io.in(roomname).emit 之后,我仍然将相同的内容记录到控制台,消息仍然没有发送/工作

标签: node.js sockets socket.io


【解决方案1】:

在分析您的代码(OP 通过聊天提供完整代码)后,我发现了问题。

你在客户端有多个socket.io连接,每个var socket = io();创建一个新的连接和一个新的socket id。

您正在使用此代码加入房间:

var socket = io();
$("#form-send-message").submit(function () {
     var messageDetails = {
        sender: "<%=currentUser.username%>",
        recipient: $(this).find("textarea").val(),
        message: $(this).find(".chat-message-input").val()
    }
    socket.emit("chat message", messageDetails);
    $(".chat-message-input").val("");
    return false;
});

然后您希望来自服务器的io.in(room).emit 进入"chat message" 侦听器,当您覆盖套接字并创建新连接时,新套接字从未加入房间。

var socket = io(); //A new connection, a complete different socket

//This socket never joined the room

socket.on("chat message", function(msg) {
    alert("received message");
    console.log(msg.message);
    if (msg[message] != "") {
        $(".chat-history-div").append($("<li>").text(msg.message));
    }
});

您应该只有 1 个单一连接。

所以要解决您的问题:

var socket = io();
$("#form-send-message").submit(function () {
     var messageDetails = {
        sender: "<%=currentUser.username%>",
        recipient: $(this).find("textarea").val(),
        message: $(this).find(".chat-message-input").val()
    }
    socket.emit("chat message", messageDetails);
    $(".chat-message-input").val("");
    return false;
});

socket.on("chat message", function(msg) {
    alert("received message");
    console.log(msg[message]);
    if (msg[message] != "") {
        $(".chat-history-div").append($("<li>").text(msg.message));
    }
});

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多