摘要:隊(duì)列長度,拿到客戶端用戶請先登錄用戶身份無效請重新登錄非法操作發(fā)送數(shù)據(jù)失敗
TP是最新版本的;
大概實(shí)現(xiàn)的有,用戶注冊,注冊完畢之后跳轉(zhuǎn)到登錄頁面;
登錄之后生成身份令牌(token)存到Redis;
在聊天界面沒有任何ajax請求,只要在握手的時(shí)候有一個(gè)http請求,實(shí)在是搞不懂一些人,在聊天界面發(fā)布消息用ajax去發(fā)布,
做了一些處理,一個(gè)瀏覽器里面只能用一個(gè)賬號,所以測試的時(shí)候必須用兩個(gè)瀏覽器
之后跳轉(zhuǎn)到聊天界面,然后建立WebSocket握手,在握手的同時(shí)攜帶toekn,以及對方的ID(朋友的ID) ;
后臺(tái)服務(wù)器在OnOpen的時(shí)候做一系列的操作,例如(檢測token,檢測朋友的ID,將自己的ID和fd更新到數(shù)據(jù)表,fd綁定uid等..);
這些檢測都通過之后獲取聊天記錄,為了效率是拉取和朋友的15條聊天記錄;
在OnMessage中獲取了發(fā)送的數(shù)據(jù)!
在發(fā)送之后檢測對方是否在線,如果不在線就不用發(fā)送給對方,如果對方在線就將信息push給他!
心跳檢測: 每5秒檢測一次,如果在100秒沒有任何操作將斷開連接,斷開連接的同時(shí)將數(shù)據(jù)庫中的fd清空!
代碼很簡單,,,但是有個(gè)別的問題沒有解決,比如在線統(tǒng)計(jì)(connections)
下面貼上Socket_Server.php的代碼 其他的都是沒有什么邏輯的代碼!
完整的等之后寫完了再發(fā)出來吧,大家共同進(jìn)步!
4, // 設(shè)置啟動(dòng)的Worker進(jìn)程數(shù) "daemonize" => false, //守護(hù)進(jìn)程化。 "backlog" => 128, //Listen隊(duì)列長度, "dispatch_mode" => 2, "heartbeat_check_interval" => 5, "heartbeat_idle_time" => 100, ]; public function onOpen(swoole_websocket_server $server, swoole_http_request $req) { $fd = $req->fd; $token = $req->get["token"] ?? ""; //拿到客戶端用戶ID if (!$token) { $server->push($fd, Tool::showAjax(["status" => 3, "message" => "請先登錄!"])); $server->close($fd); return; } $userData = Cache::get($token); if (!$userData) { $server->push($fd, Tool::showAjax(["status" => 2, "message" => "用戶身份無效,請重新登錄!"])); $server->close($fd); return; } self::$uid = $req->get["friendId"]; if (self::$uid == $userData["uid"]) { $server->push($fd, Tool::showAjax(["status" => 2, "message" => "非法操作!"])); $server->close($fd); } $server->bind($fd, $userData["uid"]); $messages = Message::getMessage($userData["uid"]); (new UserModel())->where("id", $userData["uid"])->update(["fd" => $req->fd]); $arr = $messages->toArray(); sort($arr); $server->push($fd, Tool::showAjax(["status" => 1, "message" => "success", "data" => $arr])); } public function onMessage(swoole_websocket_server $server, swoole_websocket_frame $frame) { $message = $frame->data; if (empty($message)) return; $data = [ "uid1" => $server->getClientInfo($frame->fd)["uid"], "uid2" => self::$uid, "message" => htmlspecialchars($message), "send_uid" => $server->getClientInfo($frame->fd)["uid"] ]; try { (new Message())->save($data); } catch (Exception $e) { $server->push($frame->fd, Tool::showAjax(["status" => "2", "message" => "發(fā)送數(shù)據(jù)失敗!"])); } $messages = Message::getMessage($server->getClientInfo($frame->fd)["uid"]); $friendData = UserModel::geUserDataFd(self::$uid); $arr = $messages->toArray(); sort($arr); if ($friendData) { $server->push($friendData, Tool::showAjax(["status" => 1, "message" => "success", "data" => $arr])); } $server->push($frame->fd, Tool::showAjax(["status" => 1, "message" => "success", "data" => $arr])); } function onClose(swoole_server $server, int $fd, int $reactorId) { (new UserModel())->where("fd", $fd)->update(["fd" => ""]); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28961.html
摘要:隊(duì)列長度,拿到客戶端用戶請先登錄用戶身份無效請重新登錄非法操作發(fā)送數(shù)據(jù)失敗 showImg(https://segmentfault.com/img/bVbc34G?w=1618&h=768); TP是最新版本的;大概實(shí)現(xiàn)的有,用戶注冊,注冊完畢之后跳轉(zhuǎn)到登錄頁面;登錄之后生成身份令牌(token)存到Redis;在聊天界面沒有任何ajax請求,只要在握手的時(shí)候有一個(gè)http請求,實(shí)...
摘要:是一個(gè)請求對象,包含了客戶端發(fā)來的握手請求信息事件函數(shù)中可以調(diào)用向客戶端發(fā)送數(shù)據(jù)或者調(diào)用關(guān)閉連接事件回調(diào)是可選的當(dāng)服務(wù)器收到來自客戶端的數(shù)據(jù)幀時(shí)會(huì)回調(diào)此函數(shù)。 前言:了解概念之后就應(yīng)該練練手啦,不然就是巨嬰 有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報(bào)三連 代碼倉庫 實(shí)戰(zhàn)swoole【聊天室】 在線體驗(yàn) 準(zhǔn)備工作 需要先看初識(shí)swoole【上】,了解基本的服務(wù)端...
摘要:今天來做一個(gè)簡單的聊天室支持換房間支持私信的寫的代碼有點(diǎn)渣里面有很多不是很好的地方畢竟我只是一個(gè)野生程序猿環(huán)境地址樣子差不多是這個(gè)樣子的我不想把代碼發(fā)到我的服務(wù)器上因?yàn)檫@個(gè)項(xiàng)目太小了很垃圾而且怕被攻擊這里有錄的一個(gè)演示視頻沒有廣告的你們可以 今天來做一個(gè)簡單的聊天室,支持換房間,支持私信的. 寫的代碼有點(diǎn)渣,里面有很多不是很好的地方.畢竟我只是一個(gè)野生程序猿. 環(huán)境: php7.0...
閱讀 1041·2019-08-30 12:57
閱讀 2114·2019-08-30 11:11
閱讀 2177·2019-08-29 15:20
閱讀 1870·2019-08-29 14:12
閱讀 3274·2019-08-28 17:51
閱讀 2378·2019-08-26 13:23
閱讀 789·2019-08-26 10:34
閱讀 3844·2019-08-23 12:37