我有一个带有socket.io并在客户端angular2上的nodejs Web服务器。 我试图通过socket.io连接的客户端管理多个客户端,但仅管理那些在其帐户中登录的客户端。
例如,我为用户和管理员提供了一个支持区域。在给用户添加票证时,该用户应收到一个socket.io私人通知,即票证已由管理员添加。如果管理员和用户正确登录并且管理员将票证盖起来,则此方法效果很好。 (展示自己的测试票) 但是,如果管理员刷新页面(按F5键)并再次给自己盖一张票,该通知将不会出现。
这是用户通过angular2连接到Web服务器的部分:
io.on('connection', function (socket) {
console.log('a user connected ', socket.id);
io.sio_id = socket.id; // set socket id for client
socket.emit('sio_id', io.sio_id); // send it to client
socket.on("disconnect", function () {
console.log('a user disconnected');
User.findOne({
where: {sio_id: socket.id}
})
.then((user) => {
if (user) {
user.update({sio_id: null});
}
});
});
// receive the userId to update users sio_id in database
socket.on('set_sio_id', function (uData) {
User.findOne({where: {id: uData.uid}})
.then((user) => user.update({sio_id: uData.sid}))
.then(() => {
let socket = io.sockets.connected[uData.sid];
socket.join(uData.sid)
})
})
});
客户端ID将发送到客户端应用程序,然后客户端应用程序再次将clientId和userId发送回服务器。然后,clientId将保存在数据库中。之后,我想使用此“ sio” -id通过socket.io与用户通信,如下所示:
ticket.update({status: 0, awnser_text: awnser}).then((result) => {
const socketId = ticket.dataValues.creator.dataValues.sio_id;
let socket = io.sockets.connected[socketId];
// if user is online, emit
io.to(socketId).emit('support_awnser', 'ok');
res.send({status: true, data: result});
因此,我获取了拥有票证的用户ID,并从数据库中获取了他的sio-id并发出了一些东西。
这是有角度的应用程序收听和发出声音的方式:
/**
* Listen to an event
* @param to
*/
listen(to: string) {
return new Observable(observer => {
this.socket = io(this.SERVER_URL);
this.socket.on(to, data => {
observer.next(data);
});
return () => {
this.socket.disconnect();
};
});
}
/**
* Send something to the server
* @param event
* @param msg
*/
send(event, msg) {
this.socket.emit(event, msg);
}
如前所述,它可以正常登录并且不刷新页面。如果我刷新页面,则该页面不起作用,不会发出(或接收)任何内容