摘要:隊列長度,拿到客戶端用戶請先登錄用戶身份無效請重新登錄非法操作發(fā)送數(shù)據(jù)失敗
TP是最新版本的;
大概實現(xiàn)的有,用戶注冊,注冊完畢之后跳轉(zhuǎn)到登錄頁面;
登錄之后生成身份令牌(token)存到Redis;
在聊天界面沒有任何ajax請求,只要在握手的時候有一個http請求,實在是搞不懂一些人,在聊天界面發(fā)布消息用ajax去發(fā)布,
做了一些處理,一個瀏覽器里面只能用一個賬號,所以測試的時候必須用兩個瀏覽器
之后跳轉(zhuǎn)到聊天界面,然后建立WebSocket握手,在握手的同時攜帶toekn,以及對方的ID(朋友的ID) ;
后臺服務器在OnOpen的時候做一系列的操作,例如(檢測token,檢測朋友的ID,將自己的ID和fd更新到數(shù)據(jù)表,fd綁定uid等..);
這些檢測都通過之后獲取聊天記錄,為了效率是拉取和朋友的15條聊天記錄;
在OnMessage中獲取了發(fā)送的數(shù)據(jù)!
在發(fā)送之后檢測對方是否在線,如果不在線就不用發(fā)送給對方,如果對方在線就將信息push給他!
心跳檢測: 每5秒檢測一次,如果在100秒沒有任何操作將斷開連接,斷開連接的同時將數(shù)據(jù)庫中的fd清空!
代碼很簡單,,,但是有個別的問題沒有解決,比如在線統(tǒng)計(connections)
下面貼上Socket_Server.php的代碼 其他的都是沒有什么邏輯的代碼!
完整的等之后寫完了再發(fā)出來吧,大家共同進步!
4, // 設置啟動的Worker進程數(shù) "daemonize" => false, //守護進程化。 "backlog" => 128, //Listen隊列長度, "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/95895.html
摘要:隊列長度,拿到客戶端用戶請先登錄用戶身份無效請重新登錄非法操作發(fā)送數(shù)據(jù)失敗 showImg(https://segmentfault.com/img/bVbc34G?w=1618&h=768); TP是最新版本的;大概實現(xiàn)的有,用戶注冊,注冊完畢之后跳轉(zhuǎn)到登錄頁面;登錄之后生成身份令牌(token)存到Redis;在聊天界面沒有任何ajax請求,只要在握手的時候有一個http請求,實...
摘要:是一個請求對象,包含了客戶端發(fā)來的握手請求信息事件函數(shù)中可以調(diào)用向客戶端發(fā)送數(shù)據(jù)或者調(diào)用關(guān)閉連接事件回調(diào)是可選的當服務器收到來自客戶端的數(shù)據(jù)幀時會回調(diào)此函數(shù)。 前言:了解概念之后就應該練練手啦,不然就是巨嬰 有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 代碼倉庫 實戰(zhàn)swoole【聊天室】 在線體驗 準備工作 需要先看初識swoole【上】,了解基本的服務端...
摘要:今天來做一個簡單的聊天室支持換房間支持私信的寫的代碼有點渣里面有很多不是很好的地方畢竟我只是一個野生程序猿環(huán)境地址樣子差不多是這個樣子的我不想把代碼發(fā)到我的服務器上因為這個項目太小了很垃圾而且怕被攻擊這里有錄的一個演示視頻沒有廣告的你們可以 今天來做一個簡單的聊天室,支持換房間,支持私信的. 寫的代碼有點渣,里面有很多不是很好的地方.畢竟我只是一個野生程序猿. 環(huán)境: php7.0...
閱讀 3461·2023-04-26 02:48
閱讀 1465·2021-10-11 10:57
閱讀 2490·2021-09-23 11:35
閱讀 1196·2021-09-06 15:02
閱讀 3294·2019-08-30 15:54
閱讀 1612·2019-08-30 15:44
閱讀 879·2019-08-30 15:44
閱讀 988·2019-08-30 12:52