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

Posted

技术标签:

【中文标题】socket.io 发出不接收消息的原因?【英文标题】:Reasons socket.io emit not receiving messages? 【发布时间】:2015-03-10 16:07:23 【问题描述】:

我正在开发一个 angular/node 应用程序,人们可以使用 socket.io 和 btford 的 angular-socket 模块 (https://github.com/btford/angular-socket-io) 与其他用户(例如没有群组的 Whatsapp)进行许多 1:1 聊天。现在 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;
);

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

【问题讨论】:

你确定C之后的客户端代码是正确的吗,$不是错字吗? 您的 Angular 代码的哪一部分发出“socket:relaymsg”消息? @MaximePiraux,不确定您指的是哪个部分,假设您的意思是“$scope.$on”...我基本上是在遵循这里的示例:github.com/btford/angular-socket-io跨度> @laggingreflex(顺便说一句,用户名上哈哈),C部分下的行应该是发射的,即socket.broadcast.to(room).emit('relaymsg', msg); 如果你使用DEBUG=* node app.js,你看到C正在连接还是断开? 【参考方案1】:

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

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

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

由于 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) 每次用户关闭手机时,都会断开他们与聊天室的连接,即使聊天室是手机上打开的最后一个屏幕

希望对未来的人们有所帮助!

【讨论】:

以上是关于socket.io 发出不接收消息的原因?的主要内容,如果未能解决你的问题,请参考以下文章

当接收器离线时,socket.io 发出不工作

当接收器离线时,socket.io 发出不工作

socket.io 客户端未从服务器接收消息

在 Android 上发出 socket.io 消息

Socket.io 客户端无法发出消息

Node.JS JavaScript socket.io 在微服务架构中发出消息