资讯专栏INFORMATION COLUMN

TP5.1.18+swoole实现聊天室

henry14 / 1474人阅读

摘要:队列长度,拿到客户端用户请先登录用户身份无效请重新登录非法操作发送数据失败

TP是最新版本的;
大概实现的有,用户注册,注册完毕之后跳转到登录页面;
登录之后生成身份令牌(token)存到Redis;
在聊天界面没有任何ajax请求,只要在握手的时候有一个http请求,实在是搞不懂一些人,在聊天界面发布消息用ajax去发布,

做了一些处理,一个浏览器里面只能用一个账号,所以测试的时候必须用两个浏览器

之后跳转到聊天界面,然后建立WebSocket握手,在握手的同时携带toekn,以及对方的ID(朋友的ID) ;

后台服务器在OnOpen的时候做一系列的操作,例如(检测token,检测朋友的ID,将自己的ID和fd更新到数据表,fd绑定uid等..);
这些检测都通过之后获取聊天记录,为了效率是拉取和朋友的15条聊天记录;

在OnMessage中获取了发送的数据!
在发送之后检测对方是否在线,如果不在线就不用发送给对方,如果对方在线就将信息push给他!

心跳检测: 每5秒检测一次,如果在100秒没有任何操作将断开连接,断开连接的同时将数据库中的fd清空!

代码很简单,,,但是有个别的问题没有解决,比如在线统计(connections)

下面贴上Socket_Server.php的代码 其他的都是没有什么逻辑的代码!

完整的等之后写完了再发出来吧,大家共同进步!

 4, // 设置启动的Worker进程数 
        "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" => "发送数据失败!"]));
        }

        $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" => ""]);
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95895.html

相关文章

  • TP5.1.18+swoole实现天室

    摘要:队列长度,拿到客户端用户请先登录用户身份无效请重新登录非法操作发送数据失败 showImg(https://segmentfault.com/img/bVbc34G?w=1618&h=768); TP是最新版本的;大概实现的有,用户注册,注册完毕之后跳转到登录页面;登录之后生成身份令牌(token)存到Redis;在聊天界面没有任何ajax请求,只要在握手的时候有一个http请求,实...

    roland_reed 评论0 收藏0
  • 实战 swoole天室

    摘要:是一个请求对象,包含了客户端发来的握手请求信息事件函数中可以调用向客户端发送数据或者调用关闭连接事件回调是可选的当服务器收到来自客户端的数据帧时会回调此函数。 前言:了解概念之后就应该练练手啦,不然就是巨婴 有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 代码仓库 实战swoole【聊天室】 在线体验 准备工作 需要先看初识swoole【上】,了解基本的服务端...

    andycall 评论0 收藏0
  • swoole 超简单 构建天室.资辞 群聊,组聊,单聊.

    摘要:今天来做一个简单的聊天室支持换房间支持私信的写的代码有点渣里面有很多不是很好的地方毕竟我只是一个野生程序猿环境地址样子差不多是这个样子的我不想把代码发到我的服务器上因为这个项目太小了很垃圾而且怕被攻击这里有录的一个演示视频没有广告的你们可以 今天来做一个简单的聊天室,支持换房间,支持私信的. 写的代码有点渣,里面有很多不是很好的地方.毕竟我只是一个野生程序猿. 环境: php7.0...

    Towers 评论0 收藏0

发表评论

0条评论

henry14

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<