Socket.IO发送聊天消息到房间

我现在有一个系统可以为个人消息创build空间:

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语句基本上以字母顺序创build房间名称(person1-person2),以防双方join房间时出现混淆。 如果它没有在这个房间,套接字join这个房间。 这一切都是在服务器收到“聊天消息”时触发的。 我已经确认套房连接部分的工作。 但是,我似乎没有得到客户端的消息:

 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(); 创build一个新的连接和一个新的套接字ID。

你正在使用这个代码join房间:

 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"监听器,当你重写套接字并创build一个新的连接时,新的套接字就不会join房间。

 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)); } }); 

你应该只有一个单一的连接。

所以要解决你的问题:

 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)); } });