socket.io发出不接收消息的原因?

时间:2015-01-12 19:50:24

标签: angularjs node.js sockets socket.io messaging

我正在开发一个角度/节点应用程序,人们可以使用socket.io和btford的angular-socket模块({{}与其他用户(例如没有组的Whatsapp)进行多次1:1聊天3}})。现在A)客户端使用emit连接socket.io房间。客户端代码是:

mySocket.emit('joinroom', room);

服务器代码是:

socket.on('joinroom', function (room){
  socket.join(room);
});

B)聊天消息通过emit发送到服务器。客户端代码是

mySocket.emit('sendmsg', data, function(data){
  console.log(data);
});

和C)服务器应通过广播向房间中的其他人发送消息。服务器代码是:

socket.on('sendmsg', function (text, room, sender, recipient, timestamp) {
  // Some code here to save message to database before broadcasting to other users
  console.log('This works');
  socket.broadcast.to(room).emit('relaymsg', msg);
});

客户端代码

$scope.$on('socket:relaymsg', function(event, data) {
  console.log('This only sometimes works');
  // do stuff to show that message was received
});

A和B似乎工作正常,但C似乎非常不可靠。服务器代码似乎没问题,但客户端似乎没有收到消息。有时候它有效,有时却没有。即“这是有效的'总是出现,但是这有时只会起作用。并不总是出现。

1)对可能导致此问题的原因有任何疑问?我的代码中有错误吗?

2)如果有很多用户可以与其他用户进行多次1:1聊天,广播和会议室是否正确设置?

如果有帮助,这是角度插座模块的工厂代码

.factory('mySocket', function (socketFactory, server) {
  var socket = socketFactory({
    ioSocket: io.connect(server)
  });
  socket.forward('relaymsg');
  return socket;
});

感谢您提供的任何帮助!提前谢谢!

1 个答案:

答案 0 :(得分:1)

感谢大家的评论,我相信我发现了主要问题。我认为有两件事会导致问题:

1)我认为更大的问题是我使用节点集群,因此用户可能会加入不同工作人员的房间而无法相互通信。我已根据此处的说明添加了粘性会话和Redis:http://socket.io/docs/using-multiple-nodes/

粘性会话非常有用,就像文档没有提及它一样,该模块会自动创建工作人员并在被杀死时重新生成它们

我无法找到大量关于如何实现sticky + redis的示例,因为socket.io 1.0相对较新,似乎与先前版本的处理方式不同,但这些非常有用:

https://github.com/Automattic/socket.io-redis/issues/31

https://github.com/evilstudios/chat-example-cluster/blob/master/index.js

2)每次用户关闭手机时,即使聊天室是手机上打开的最后一个屏幕,也会将他们与聊天室断开连接

希望将来帮助人们!