假定A用戶在聊天室,onClose時(shí),等待多秒,在等待期間判斷A用戶是否再次登錄,如果是登錄,在線,反之,離線,這個(gè)代碼怎么寫?onclose時(shí)會(huì)刷新用戶列表,該用戶的session相應(yīng)就清空了,而這個(gè)操作應(yīng)該是后臺(tái)的事情。如果前段刷新頁(yè)面ws就斷掉了,會(huì)重新建立,那又如何在logout內(nèi)獲取到用戶再次登錄的狀態(tài)?
舉例說明:
setTimeout(function(){
(用戶執(zhí)行到這里時(shí)應(yīng)該是刷新頁(yè)面或者是關(guān)閉頁(yè)面了,我主要不明白的是,這里如何獲取到該用戶再次建立ws的方法,我想是不是獲取當(dāng)前用戶的uid,然后再取出cookie或session的用戶列表與該用戶相對(duì)應(yīng)的uid,如果存在,說明在線,break跳出,如果不存在說明離線,繼續(xù)執(zhí)行下面的代碼,不知道我的邏輯對(duì)不對(duì),或者是或者說是在后臺(tái)進(jìn)行判斷等其他方法)
執(zhí)行函數(shù)();
},5000);
瀏覽器:新用戶A進(jìn)入頁(yè)面,判斷沒有cookie uid,ws正常登錄
服務(wù)端:workerman收到A用戶登錄請(qǐng)求,發(fā)現(xiàn)沒傳uid,是新用戶,分配全局唯一uid,本地也記錄一個(gè)uid $_SESSION=xxx,并給A單獨(dú)發(fā)一條賦值uid的數(shù)據(jù)包 類似{type:'setuid', uid:xxx}
瀏覽器:A用戶收到賦值uid的數(shù)據(jù)包{type:'setuid', uid:xxx}本地寫個(gè)cookie uid=xxx
瀏覽器:B用戶收到了A登錄的廣播,按照原有邏輯展示
瀏覽器:這時(shí)A用戶刷新頁(yè)面
服務(wù)端:workerman發(fā)現(xiàn)用戶A斷開,這時(shí)要從$_SESSION得到uid,然后廣播A退出時(shí)帶上uid,包類似{type:'logout', uid:'xxx',....}
瀏覽器:B用戶收到A退出的包 類似{type:'logout', uid:'xxx',....},得到退出用戶的uid,先不刷新用戶列表,弄個(gè)定時(shí)器延遲刷新, timer_xxx = setTimeout(function(){/_刷新邏輯_/}, 5000);
瀏覽器:A用戶重新進(jìn)入頁(yè)面,判斷cookie 有uid,ws鏈接后,登錄包帶上uid 類似{type:'login', uid:xxx, ....}
服務(wù)端:workerman收到A登錄的包{type:'login', uid:xxx, ....},發(fā)現(xiàn)有uid,是之前登錄過的用戶,帶上uid廣播,{type:'login', uid:xxx, ....}
瀏覽器:B用戶收到了A用戶進(jìn)入聊天室的廣播{type:'login', uid:xxx, ....},里面有uid,判斷timer_xxx是否存在并被觸發(fā),如果存在并且沒觸發(fā)則刪除此計(jì)時(shí)器。這樣就不會(huì)有用戶刷新頁(yè)面導(dǎo)致的下線又上線的問題。
cookie一定要用嗎?cookie是存在本地的,我做的登錄是session存儲(chǔ)的,沒有用cookie,只要瀏覽器不關(guān)閉用戶就算是在線,我不太明白cookie在這里的作用
一般session也是通過cookie實(shí)現(xiàn)的,客戶端把session_id(類似uid)通過cookie傳遞給服務(wù)器,服務(wù)器根據(jù)session_id從磁盤(存儲(chǔ))中讀取session數(shù)據(jù),得到用戶的session。
長(zhǎng)鏈接聊天也是差不多,要識(shí)別用戶,一般需要客戶端傳遞一個(gè)類似session_id。你可以直接用session_id當(dāng)作uid。
區(qū)別就是長(zhǎng)鏈接一般只要在建立鏈接時(shí)提供session_id即可,后面就直接通訊了。不像http短鏈接,每次提供session_id
@1:服務(wù)端:workerman收到A用戶登錄請(qǐng)求,發(fā)現(xiàn)沒傳uid,是新用戶,分配全局唯一uid,本地也記錄一個(gè)uid $_SESSION['uid']=xxx,問一下這個(gè)uid是不是$client_id?在哪段代碼里生成的呢?可以自己規(guī)定生成的$client_id嗎
這里說的uid是用來標(biāo)記是不是同一個(gè)瀏覽器,可以看成是瀏覽器的id。client_id是網(wǎng)頁(yè)上發(fā)起的socket 連接的id,同一個(gè)瀏覽器開了多個(gè)聊天網(wǎng)頁(yè)窗口就會(huì)建立多個(gè)socket連接,就會(huì)有多個(gè)client_id,但是只有一個(gè)瀏覽器id
如果客戶端是真的斷開瀏覽器setTimeout(function(){}也執(zhí)行了,那上面說到的保存cookie的瀏覽器id是不是要清除掉?