我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现web聊天室

使用Python模块中的select模块实现web聊天室功能select模块Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持sel
2023-01-31

Java聊天室之实现聊天室服务端功能

这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室服务端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
2022-11-13

Java聊天室之实现聊天室客户端功能

这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室客户端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
2022-11-13

python socket实现聊天室

本文实例为大家分享了python socket实现聊天室的具体代码,供大家参考,具体内容如下 server端import socket import json,struct from concurrent.futures import Th
2022-06-02

AngularJS+Node.js实现在线聊天室

不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍,对于基本的使用依然有很多说不清道不明的疑惑,于是决定通过做一个在线聊天室帮助理解。DEMO可
2022-06-04

android socket聊天室功能实现

前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多
2022-06-06

golang websocket聊天室怎么实现

要实现一个golang的websocket聊天室,可以遵循以下步骤:导入所需的包:import ("fmt""log""net/http""github.com/gorilla/websocket")定义一个websocket连接的upg
golang websocket聊天室怎么实现
2024-02-29

JavaScript实现QQ聊天室功能

这篇文章主要为大家详细介绍了JavaScript实现QQ聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

Java怎么实现NIO聊天室

这篇文章给大家分享的是有关Java怎么实现NIO聊天室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。功能介绍功能:群聊+私发+上线提醒+下线提醒+查询在线用户文件Utils需要用maven导入下面两个包
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录