聊天室刷新页面不退出聊天室如何控制

jy03204340

假定A用户在聊天室,onClose时,等待多秒,在等待期间判断A用户是否再次登录,如果是登录,在线,反之,离线,这个代码怎么写?onclose时会刷新用户列表,该用户的session相应就清空了,而这个操作应该是后台的事情。如果前段刷新页面ws就断掉了,会重新建立,那又如何在logout内获取到用户再次登录的状态?
举例说明:
setTimeout(function(){
(用户执行到这里时应该是刷新页面或者是关闭页面了,我主要不明白的是,这里如何获取到该用户再次建立ws的方法,我想是不是获取当前用户的uid,然后再取出cookie或session的用户列表与该用户相对应的uid,如果存在,说明在线,break跳出,如果不存在说明离线,继续执行下面的代码,不知道我的逻辑对不对,或者是或者说是在后台进行判断等其他方法)
执行函数();
},5000);

5872 2 0
2个回答

walkor

浏览器:新用户A进入页面,判断没有cookie uid,ws正常登录
服务端:workerman收到A用户登录请求,发现没传uid,是新用户,分配全局唯一uid,本地也记录一个uid $_SESSION=xxx,并给A单独发一条赋值uid的数据包 类似{type:'setuid', uid:xxx}
浏览器:A用户收到赋值uid的数据包{type:'setuid', uid:xxx}本地写个cookie uid=xxx
浏览器:B用户收到了A登录的广播,按照原有逻辑展示
浏览器:这时A用户刷新页面
服务端:workerman发现用户A断开,这时要从$_SESSION得到uid,然后广播A退出时带上uid,包类似{type:'logout', uid:'xxx',....}
浏览器:B用户收到A退出的包 类似{type:'logout', uid:'xxx',....},得到退出用户的uid,先不刷新用户列表,弄个定时器延迟刷新, timer_xxx = setTimeout(function(){/_刷新逻辑_/}, 5000);
浏览器:A用户重新进入页面,判断cookie 有uid,ws链接后,登录包带上uid 类似{type:'login', uid:xxx, ....}
服务端:workerman收到A登录的包{type:'login', uid:xxx, ....},发现有uid,是之前登录过的用户,带上uid广播,{type:'login', uid:xxx, ....}
浏览器:B用户收到了A用户进入聊天室的广播{type:'login', uid:xxx, ....},里面有uid,判断timer_xxx是否存在并被触发,如果存在并且没触发则删除此计时器。这样就不会有用户刷新页面导致的下线又上线的问题。

  • jy03204340 2014-11-10

    cookie一定要用吗?cookie是存在本地的,我做的登录是session存储的,没有用cookie,只要浏览器不关闭用户就算是在线,我不太明白cookie在这里的作用

  • walkor 2014-11-10

    一般session也是通过cookie实现的,客户端把session_id(类似uid)通过cookie传递给服务器,服务器根据session_id从磁盘(存储)中读取session数据,得到用户的session。

    长链接聊天也是差不多,要识别用户,一般需要客户端传递一个类似session_id。你可以直接用session_id当作uid。
    区别就是长链接一般只要在建立链接时提供session_id即可,后面就直接通讯了。不像http短链接,每次提供session_id

  • jy03204340 2014-11-10

    @1:我刚才出去了,出去的时候想明白了,cookie是非常有必要的

  • jy03204340 2014-11-10

    @1:我发现问答也是用workerman做的是嘛?

  • walkor 2014-11-10

    问答不是。workerman.net是

  • helloworld 2014-11-20

    @1:服务端:workerman收到A用户登录请求,发现没传uid,是新用户,分配全局唯一uid,本地也记录一个uid $_SESSION['uid']=xxx,问一下这个uid是不是$client_id?在哪段代码里生成的呢?可以自己规定生成的$client_id吗

  • walkor 2014-11-20

    这里说的uid是用来标记是不是同一个浏览器,可以看成是浏览器的id。client_id是网页上发起的socket 连接的id,同一个浏览器开了多个聊天网页窗口就会建立多个socket连接,就会有多个client_id,但是只有一个浏览器id

1007182850

如果客户端是真的断开浏览器setTimeout(function(){}也执行了,那上面说到的保存cookie的浏览器id是不是要清除掉?

  • 暂无评论
年代过于久远,无法发表回答
🔝