原因 socket.io 发送未收到消息?
Reasons socket.io emit not receiving messages?
我正在开发一个 angular/node 应用程序,人们可以使用 socket.io 和 btford 的 angular 与其他用户(例如没有群组的 Whatsapp)进行多次 1:1 聊天- 套接字模块(https://github.com/btford/angular-socket-io)。现在 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好像很不靠谱。服务端代码好像没问题,但是客户端好像收不到消息。有时有效,有时无效。即 'This works' 总是出现,但 'This only sometimes works' 并不总是出现。
1) 对可能导致此问题的原因有任何想法吗?我的代码有错误吗?
2) 如果有很多用户,所有用户都可以与其他用户进行多次 1:1 聊天,广播和聊天室是否是正确的设置方式?
如果有帮助,这是 angular-socket 模块的工厂代码
.factory('mySocket', function (socketFactory, server) {
var socket = socketFactory({
ioSocket: io.connect(server)
});
socket.forward('relaymsg');
return socket;
});
感谢您提供的任何帮助!!提前致谢!
感谢大家的评论,我相信我找到了主要问题。我认为有两件事导致了问题:
1) 我认为更大的问题是我使用的是节点集群,因此用户可能会加入不同工作人员的房间并且无法相互通信。我最终按照此处的说明添加了粘性会话和 Redis:http://socket.io/docs/using-multiple-nodes/
粘性会话非常有用,仅供参考,因为文档没有提及它,该模块会自动创建工作人员并在被杀死时重新生成它们
我找不到大量关于如何实现 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) 每次用户关闭他们的 phone 时都会断开他们与聊天室的连接,即使聊天室是 phone
上最后打开的屏幕也是如此
希望对以后的人有所帮助!
我正在开发一个 angular/node 应用程序,人们可以使用 socket.io 和 btford 的 angular 与其他用户(例如没有群组的 Whatsapp)进行多次 1:1 聊天- 套接字模块(https://github.com/btford/angular-socket-io)。现在 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好像很不靠谱。服务端代码好像没问题,但是客户端好像收不到消息。有时有效,有时无效。即 'This works' 总是出现,但 'This only sometimes works' 并不总是出现。
1) 对可能导致此问题的原因有任何想法吗?我的代码有错误吗?
2) 如果有很多用户,所有用户都可以与其他用户进行多次 1:1 聊天,广播和聊天室是否是正确的设置方式?
如果有帮助,这是 angular-socket 模块的工厂代码
.factory('mySocket', function (socketFactory, server) {
var socket = socketFactory({
ioSocket: io.connect(server)
});
socket.forward('relaymsg');
return socket;
});
感谢您提供的任何帮助!!提前致谢!
感谢大家的评论,我相信我找到了主要问题。我认为有两件事导致了问题:
1) 我认为更大的问题是我使用的是节点集群,因此用户可能会加入不同工作人员的房间并且无法相互通信。我最终按照此处的说明添加了粘性会话和 Redis:http://socket.io/docs/using-multiple-nodes/
粘性会话非常有用,仅供参考,因为文档没有提及它,该模块会自动创建工作人员并在被杀死时重新生成它们
我找不到大量关于如何实现 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) 每次用户关闭他们的 phone 时都会断开他们与聊天室的连接,即使聊天室是 phone
上最后打开的屏幕也是如此希望对以后的人有所帮助!