我在我的Express
服务器
userbase = {'Fitz': '84Iw3MNEIMaed0GoAAAD'}; //Exapmle user to receive message and associated socket id
//Sending message to Example user
socket.on('send_msg',function(data_from_client){
//Testing for receivers socketId
console.log(userbase[data_from_client.to_user]);//This returns the socket id for Fitz in userbase successfully i.e 84Iw3MNEIMaed0GoAAAD
socket.broadcast.to(userbase[data_from_client.to_user]).emit('get_msg',{msg:data_server.msg});
});
当我在我的cliens端为'get_msg'
设置此事件的处理程序时,我感到惊讶,我什么都没得到。
.factory('SocketFctry',function(){
var socket = io('http://localhost:3002')
return socket;
})
.controller('ChatCtrl', function($scope,SocketFctry) {
SocketFctry.on('get_msg',function(received_message){
console.log(received_message);
$scope.$apply();
})
});
我的其他客户端处理程序工作正常。
SocketFctry.on('new_user', function(users,my_id){
console.log(users);
$scope.online_users = users;
$scope.$apply();
})
我的socket.io版本是1.3.7。我在这里遗漏了什么?
答案 0 :(得分:3)
socket.broadcast().to()
向所有符合to()
参数的用户发送消息,但用户socket
除外。socket.broadcast.to(socket.id)
因此,socket
永远不会发送给实际的socket.emit(...)
用户。事实上,默认情况下,它不会发送给任何人。
直接来自socket.io doc:
要进行广播,只需在emit和send方法中添加广播标志即可 调用。广播意味着向其他所有人发送消息 用于启动它的套接字。
如果您只想发送到一个套接字,那么只需使用:
io.to('some room').emit('some event'):
如果你想广播到一个socket.id类型的房间,你想要包括它的房间用户,那么使用:
socket.broadcast.to(userbase[data_from_client.to_user]).emit('get_msg',{msg:data_server.msg});
所以,你可以改变这个:
io.to(userbase[data_from_client.to_user]).emit('get_msg',{msg:data_server.msg});
到此:
MouseClick
答案 1 :(得分:0)
您是否有用户在连接时加入命名空间?
socket.join(userbase[data_from_client.to_user]); //'84Iw3MNEIMaed0GoAAAD'
您可以尝试:
socket.in(userbase[data_from_client.to_user]).emit('get_msg', {msg:data_server.msg});