我一直在阅读有关此问题的答案,现在已经有一段时间了,但没有一个解决方案似乎适用于我的设置。Socket.io页面刷新与房间断开连接
我有一个nodeJS服务器连同express。我使用Socket.io向个人用户发送通知。 (前端是Angular)
当用户登录时,他加入以他的电子邮件地址(唯一)命名的房间。
io.on('connection', function (socket) {
socket.on('join', function(user) {
//list of connected users
connected_users.push({socket_id: socket.id, email: user.email});
socket.join(user.email);
});
...
的join
事件从角广播时在用户登录
这样我可以通过使用电子邮件地址发送邮件,像这样简单地通知:
io.sockets.in(to).emit('notification', {
message: msg,
source: from,
destination: to,
event: data
});
当用户手动注销我注册了以下事件监听器:
socket.on('leave', function(user) {
//remove the user from the list
var index = findUserConnected(socket.id);
if(index != null) {
connected_users.splice(index, 1);
}
socket.leave(user.email);
});
socket.on('disconnect', function() {
//if the user refreshes the page, he is still in the connected users list
var email = findEmailUserConnected(socket.id);
if(email != null) {
//we make him join back his room
socket.join(email);
}
});
技术上这个作品:终于有每当用户注销或刷新页面是在disconnect
处理程序。在页面刷新时,用户加入他的房间。
问题只出现在页面刷新上,即使用户在他的房间里也没有收到使用io.sockets.in(email).emit('notification', {});
发送的通知。
显然页面刷新调用socket.disconnect()
,它会生成一个新的socket_id。我不确定是否有办法将socket_id重新分配给一个房间或类似的东西。
页面重新加载会破坏所有页面资源,包括webSocket/socket.io连接。再次加载页面会创建一个新的连接。您可能需要使用cookie来创建某种持久的会话ID,以便您可以识别以前的用户并在服务器上恢复其状态。 – jfriend00
@ jfriend00“恢复其在服务器上的状态”是什么意思?当页面刷新时,我已经有了socket.join,用户被识别出来......等等。 – gyc
在发生'connection'事件时,您需要能够识别您之前配置到一个房间中的套接字并将其状态恢复为您想要的方式(将它放回房间中,更新'socket.id'属于这个用户,等等......通常,人们会使用从cookie中获得的信息将这个新的传入连接与您以前见过的特定用户关联起来 – jfriend00