国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TP5.1.18+swoole實(shí)現(xiàn)聊天室

roland_reed / 2643人閱讀

摘要:隊(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

相關(guān)文章

  • TP5.1.18+swoole實(shí)現(xiàn)天室

    摘要:隊(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í)...

    henry14 評論0 收藏0
  • 實(shí)戰(zhàn) swoole天室

    摘要:是一個(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ù)端...

    andycall 評論0 收藏0
  • swoole 超簡單 構(gòu)建天室.資辭 群聊,組聊,單聊.

    摘要:今天來做一個(gè)簡單的聊天室支持換房間支持私信的寫的代碼有點(diǎn)渣里面有很多不是很好的地方畢竟我只是一個(gè)野生程序猿環(huán)境地址樣子差不多是這個(gè)樣子的我不想把代碼發(fā)到我的服務(wù)器上因?yàn)檫@個(gè)項(xiàng)目太小了很垃圾而且怕被攻擊這里有錄的一個(gè)演示視頻沒有廣告的你們可以 今天來做一個(gè)簡單的聊天室,支持換房間,支持私信的. 寫的代碼有點(diǎn)渣,里面有很多不是很好的地方.畢竟我只是一個(gè)野生程序猿. 環(huán)境: php7.0...

    Towers 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<