angularjs - socket.io 发出未接收消息的原因?

标签 angularjs node.js sockets socket.io messaging

我正在开发一个 Angular/Node 应用程序,人们可以使用 socket.io 和 btford 的 Angular-socket 模块 ( https://github.com/btford/angular-socket-io ) 与其他用户进行多次 1:1 聊天(例如没有群组的 Whatsapp)。现在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 聊天,那么广播和房间是设置此功能的正确方法吗?

如果有帮助,这是 Angular-socket 模块的工厂代码

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

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

最佳答案

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

1)我认为更大的问题是我使用 Node 集群,因此用户可能会加入不同工作人员的房间并且无法相互通信。我最终按照此处的说明添加了粘性 session 和 Redis:http://socket.io/docs/using-multiple-nodes/

粘性 session 非常有用,仅供引用,因为文档没有提及它,该模块会自动创建工作人员并在被杀死时重新生成它们

我找不到大量关于如何实现 Sticky+redis 的示例,因为 socket.io 1.0 相对较新,并且处理 Redis 的方式似乎与以前的版本不同,但这些非常有帮助:

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

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

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

希望对 future 的人们有所帮助!

关于angularjs - socket.io 发出未接收消息的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909654/

相关文章:

javascript - 为什么 TS 不生成纯 JavaScript 代码,而是生成 Node.js 函数?

c - Winsock C TCP 套接字

javascript - 在IE11中测试时无法击中 Spring Controller

javascript - 双向绑定(bind)在 ES6 中不起作用

node.js - util.inspect - 如果数字为 0,则将字符串设为红色

node.js - 在 View 中对我的数据进行分组 - nodejs

javascript - 如何合并两个json对象得到一个json对象?

javascript - 在 ng-init 中声明多个值

C# TCP Socket "Blocking"属性不一致

javascript - 在 NodeJS 上跨页面请求维护后端连接?