文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

workerman webman+GatewayWorker实现聊天室demo实例

2023-09-07 11:08

关注

workerman webman+GatewayWorker实现聊天室demo实例

说明

最近先来无事发现workerman的webman作为web框架很不错,想着写一个demo。于是就动手了,本人前端不太好,所以页面较丑,不要介意哈哈哈。

官方文档

https://www.workerman.net/

workerman 真的很不错,社区环境也不错,基本上有问题都有答复。有时间我也会多研究下,后面也会分享出来

重磅

demo地址: https://gitee.com/xiaoqiaoniubi/my-webman-chat

  1. 先下载下项目,将根目录下的webman-chat.sql 导入至数据库,数据库名称为:webman-chat。可在数据库配置文件中修改
  2. 执行 composer install
  3. windows环境:直接双击根目录下的windows.bat的文件,并在网站中访问localhost:8787
  4. linux环境:防火墙等开放7272端口(websocket),在根目录上执行 php start.php start

代码片段

  1. 服务端监听websocket:
    位置:根目录/plugin/webman/gateway/Events.php
    public static function onWebSocketConnect($client_id, $data)    {        // 拿到连接时携带的token 查询uid        $getData = $data['get'];        $userModel = new User();        $userInfo = $userModel -> getUserInfoByToken($getData['token']);        if (empty($userInfo)) { // token过期            send($client_id,'账号信息错误,请重新登录',[                'type' => MsgType::LOGIN_ERROR,            ]);            sleep(1); // 延迟一秒断开链接            return Gateway::closeClient($client_id);        }        $uid = $userInfo -> id;        // 重复上线验证        if (count(Gateway::getClientIdByUid($uid)) > 0) {            send($client_id,'当前账号已在线,请换个账号',[                'type' => MsgType::ERROR,            ]);            sleep(1); // 延迟一秒断开链接            return Gateway::closeClient($client_id);        }        // uid 绑定 client_id        Gateway::bindUid($client_id,$uid);        // 用户是否创建过房间,是否显示创建房间 or 我的房间 按钮        $roomModel = new Room();        $roomInfo = $roomModel -> getUserRoom($uid);        $roomList = $roomModel -> getRoomListByIds();        send($client_id,'连接成功',[            'client_id' => $client_id,            'type' => MsgType::LOGIN,            'room_id' => empty($roomInfo) ? 0 : $roomInfo -> id,            'room_list' => $roomList,        ]);    }    public static function onMessage($client_id, $message)    {        $message = json_decode($message,true);        $data = $message['data'] ?? [];        switch ($message['type']) {            case MsgType::JOIN: // 加入房间                $userModel = new User();                $userInfo = $userModel -> getUserInfoByToken($data['token']);                // 加入房间                Gateway::joinGroup($client_id,$data['room_id']);                // 获取房间列表                $roomUserList = Gateway::getUidListByGroup($data['room_id']);                $finalUserList = [];                foreach ($roomUserList as $key => $val) {                    // 查询用户昵称                    $userInfo = $userModel -> getUserInfoByUid($val);                    $finalUserList[] = ['user_id' => $val,'nickname' => empty($userInfo) ? '未知用户' : $userInfo -> nickname];                }                // 向房间广播                send_to_group($data['room_id'],'请求成功',[                    'type' => MsgType::JOIN,                    'nickname' => $userInfo -> nickname,                    'online_num' => count($finalUserList),                    'online_list' => $finalUserList,                ]);                break;            case MsgType::SEND_MSG:                $userModel = new User();                $userInfo = $userModel -> getUserInfoByToken($data['token']);                // 广播到房间                send_to_group($data['room_id'],'请求成功',[                    'type' => MsgType::SEND_MSG,                    'send_user_nickname' => $userInfo -> nickname,                    'send_user_id' => $userInfo -> id,                    'send_content' => $data['content'],                ]);                break;            default:                send($client_id,'请求成功',['client_id' => $client_id]);                break;        }    }
  1. 客户端监听服务端websocket:
    位置:根目录/public/static/chat_js/base.js
function onmessage(e) {    var data = JSON.parse(e.data);    var fullData = data;    data = data.data;    switch(data.type){        case 'login':            // 当前用户有房间则显示进入入口,否则显示创建入口            if (data.room_id > 0) {                $('.create_room .join_room').attr('data-room-id',data.room_id);                $('.create_room .join_room').show();                $('.do_create_room').hide();            } else {                $('.create_room .join_room').hide();                $('.do_create_room').show();            }            client_id = data.client_id;            // 房间列表更新            $('.room_list').empty();            var roomDom = '';            $.each(data.room_list,function(i,val) {                roomDom += '+val.id+'">'+val.room_name+'

'; }); $('.room_list').append(roomDom); break; case 'join': $('.onlineNum').text(data.online_num); // 重新渲染房间列表 $('.online_user_list').empty(); var onlineUserDom = ''; $.each(data.online_list, function(i,val){ onlineUserDom += '
' + '用户'+(i+1)+':' + ''+val.nickname+' 已加入' + '
'
}); $('.online_user_list').append(onlineUserDom); break; case 'send_msg': var msgDom = ''; msgDom += '

'+data.send_user_nickname+' 说:'+data.send_content+'

'
; $('.msg_content').append(msgDom); break; case 'login_error': showLogin(); break; default: break; }}

结尾

大家有问题可以留言哦,不要吝啬star 和 点赞哦。

来源地址:https://blog.csdn.net/IT_guoguo/article/details/128254585

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯