【发布时间】:2013-01-24 03:09:22
【问题描述】:
我正在尝试为我的应用实现聊天模块并遇到 2 个问题。
第一个是我在套接字中的客户端不断自动断开连接。 这就是我正在做的事情。
我的客户在一个动态创建的房间中连接,房间的名称是我生成的随机 ID。现在,当客户发送消息时,我打印一个日志以查看房间里有多少人,然后它在服务器端记录“2”,这是正确的。但是当我继续从客户端向服务器发送消息时,它开始显示“1”客户端已连接,一段时间后它显示我有 0 个客户端已连接到房间.人们自动断开连接,为什么会发生这种情况?
socket.on('SendChat',function(msgobj){ //pass the message to all people in the room.
console.log("Msg from" + msgobj.MsgSenderName + " in RoomID = "+ msgobj.RoomID);
console.log("People in room " +io.sockets.clients(msgobj.RoomID).length);
socket.broadcast.to(String(msgobj.RoomID)).emit('RecieveChat',msgobj);
});
当有人从任何客户端发送消息时在服务器端引发此事件,msgobj 将包含 RoomID。因此您可以看到我正在记录房间中的人数。
第二个问题是我正在尝试广播从客户端收到的消息。但是没有引发另一个客户端的事件。在上面的代码中,您可以看到我用来向所有客户端广播消息的最后一行其他客户端,但这些客户端的事件没有被触发我不知道为什么。这是我的客户端上的内容
this.Socket.on('RecieveChat',function(obj){
self.Controller.RecieveChat(obj);
});
这是我的日志
你可以看到RoomID 是一样的,但是房间里的人都离开了,这个快照只显示了1 people in room,之前房间里有两个人,然后减少到 1,最终变成 0。
编辑:
当我将socket.broadcast.to(String(msgobj.RoomID)).emit('RecieveChat',msgobj); 更改为socket.broadcast.emit('RecieveChat',msgobj); 时,它开始工作,但如果我使用to 方法在room 内发出信号,它就无法工作。
Transport end (close timeout)这似乎是导致问题的原因。如何解决这个问题?
【问题讨论】: