socket.io将聊天消息发送到房间



我当前在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语句基本上会以字母顺序创建RoomName(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;
});

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

您在客户端具有多个socket.io连接,每个var socket = io();都会创建一个新连接和一个新的套接字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));
    }
});

最新更新