基本思路

1、下载 GatewayWorker

下载 GatewayWorker ,解压到任意位置,其结构如下:

.
├── Applications // 这里是所有开发者应用项目
│   └── YourApp  // 其中一个项目目录,目录名可以自定义
│       ├── Events.php // 开发者只需要关注这个文件
│       ├── start_gateway.php // gateway进程启动脚本,包括端口号等设置
│       ├── start_businessworker.php // businessWorker进程启动脚本
│       └── start_register.php // 注册服务启动脚本
│
├── start.php // 全局启动脚本,此脚本会依次加载Applications/项目/start_*.php启动脚本
│
└── vendor    // GatewayWorker框架和Workerman框架源码目录,此目录开发者不用关心

2、修改 websocket 协议

修改 GatewayWorker 默认的进程协议,即找到 start_gateway.php ,按如下如下

// $gateway = new Gateway("tcp://0.0.0.0:8282");
$gateway = new Gateway("websocket://0.0.0.0:8282");

tcp 协议是为了官方 telnet 测试,为实现即时通讯,改用 websocket 协议。

3、启动服务

双击 start_for_win.bat 启动。(如果出现错误请参考这里设置php环境变量),成功启动进程之后界面如下(不能关闭该窗口)

如果是Linux 服务器,启动命令:

php start.php start -d

4、前端测试

任意 web 目录下创建 test.html,使用 js 连接并打印对应数据

<script>var ws = new WebSocket("ws://127.0.0.1:8282");ws.onmessage = function(e){console.log(e);}
</script>

浏览器打印出的结果:

5、结果分析

Gatewayworker 之所以简单,是因为我们不需要关注客户端与服务端是如何保持正常通讯的,我们只需要关注 Applications/项目/Events.php一个文件即可实现业务逻辑的处理。

查看 \Applications\YourApp\Events.php 中的 onConnect 方法

public static function onConnect($client_id){// 向当前client_id发送数据 Gateway::sendToClient($client_id, "Hello $client_id\r\n");// 向所有人发送Gateway::sendToAll("$client_id login\r\n");
}

当有客户端连接上 gateway 进程时(TCP三次握手完毕时)触发此回调函数。该函数内调用了 Gateway 的方法:

        // 向当前client_id发送数据 Gateway::sendToClient($client_id, "Hello $client_id\r\n");// 向所有人发送Gateway::sendToAll("$client_id login\r\n");

浏览器打印出来的信息就源于此!!传统 HTTP 连接只能在客户端请求服务端时才能更新数据,而 socket 协议可以直接由服务器直接给客户端发送数据,而不需要客户端请求!

6、聊天示例

修改 \Applications\YourApp\Events.php 方法如下:

<?phpuse \GatewayWorker\Lib\Gateway;class Events
{/*** 当客户端连接时触发* 如果业务不需此回调可以删除onConnect** @param int $client_id 连接id*/public static function onConnect($client_id){// 发送init请求;Gateway::sendToClient($client_id,json_encode(['type'=>'init','client_id'=>$client_id]));}/*** 当客户端发来消息时触发* @param int $client_id 连接id* @param mixed $message 具体消息*/public static function onMessage($client_id, $message){$req_data = json_decode($message,true);switch ($req_data['type']){// id绑定case "bind":Gateway::bindUid($client_id, $req_data['from_uid']);Gateway::sendToUid($req_data['from_uid'], json_encode(["type" => "bind","data" => "success to bind!!"]));break;// 文本消息case 'text':$content = nl2br(htmlspecialchars($req_data['data']));$data=['type'=>'text','content'=>$content,'from_uid'=>$req_data['from_uid'],'to_uid'=>$req_data['to_uid'],'create_time'=> date('Y-m-d H:i:s')];Gateway::sendToUid($req_data['to_uid'], json_encode($data));break;}}
}

前端页面如下:

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<input class="content" value="hello world!!"><br />
<span class="send-btn">发送</span><script>// 当前登录的 uidvar from_uid = "<?php echo $_GET["from_uid"]; ?>";var to_uid = "<?php echo $_GET["to_uid"]; ?>";var ws = new WebSocket("ws://127.0.0.1:8282");ws.onmessage = function (e) {var message =  eval("("+e.data+")");switch (message.type){case 'init':console.log("连接成功:",message);var bind = '{"type":"bind","from_uid":"'+from_uid+'"}';ws.send(bind);return;case "bind":console.log("绑定成功:",message)return;case "text":console.log("收到新消息:",message)return;}}// 点击发送$(".send-btn").click(function(){var content = $(".content").val();var message = '{"data":"'+content+'","type":"text","from_uid":"'+from_uid+'","to_uid":"'+to_uid+'"}';ws.send(message);})
</script>

重新打开 start_for_win.bat,

并且分别在浏览器中打开:demo.com/from_uid=1&to_uid=2demo.com/from_uid=2&to_uid=1 模拟uid=1 和 uid =2 的对话

注意 bindUid 方法,因为客户端每次连接都会创建一个唯一的 client_id ,我们需要将其绑定到我们业务上的user_id上,绑定之后,使用 sendToUid 方法可以向指定用户发送信息,uid 与client_id是一对多的关系。

以上是实现对话的基本思路,详情请参考官方文档 http://doc2.workerman.net/

PHP 开发实时聊天功能的基本思路 - GatewayWorker相关推荐

  1. 利用云信SDK实现前端实时聊天功能

    前言:由于项目中有聊天的功能,会根据不同的状态,来判断哪些角色的人可以参与聊天,或者结束聊天等等.由于历史原因,项目不能使用websocket  来实现实时通信,所以就使用了云信的SDK,来实现实时聊 ...

  2. Android Studio开发——蓝牙聊天功能

    Android Studio开发--蓝牙聊天功能 蓝牙工作流程 功能要求 实现要点 声明蓝牙权限 添加程序运行的状态描述文本及配色代码 布局文件 蓝牙会话的服务组件ChatService Activi ...

  3. 使用声网的RTM SDK轻松给angular应用加上实时聊天功能

    作者:陈畏民 源起 今年寒假的前半段时间, 在家捣鼓了一个情侣类web应用, 基于aspnetcore和angular搭建的; 寒假中实现了'告白', '相册', '说说', '纪念日'这些功能, 然 ...

  4. 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能

    一.文章前言 此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单. 二.开发流程及工具准备 2.1.注册微信公众平台账号. 2.2.下载安装IntelliJ ID ...

  5. openfire学习4---android客户端聊天开发之聊天功能开发

    前面我们已经把服务器搭建完成,并且在客户端实现了登录了. 和我们使用的QQ一样,想一想,登录成功之后呢?肯定是要有一个好友列表,通过这个列表,我们可以选择我们需要聊天的好友. 这里我们先研究下 xmp ...

  6. 开发社交聊天APP需要注意什么?如何快速开发聊天功能

    随着互联网的发展,人们的沟通方式也在悄悄发生变化,由原来的面对面沟通,发展为网上沟通.让大家日常生活的通讯越来越方便了,各种APP层出不穷.那么,想开发一款社交聊天并进行运营,需要注意哪些方面?如何快 ...

  7. Facebook 实时聊天架构日均处理数十亿条消息!

    摘要:Facebook 的实时聊天架构每日可处理数十亿条消息. 作者 | shivang 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: 在这篇文章中,我将 ...

  8. (开源)一款可以发文字发图片的实时聊天微信小程序,可以滚动内容到底部

    前言:因项目开发需要实现一个在线聊天功能,但发现已有的开源的实时聊天功能,一片空白,勉强有关联的也并不能满足自己的需求,所以便自己动手开发,在其中踩了很多坑,吃了很多苦,为了让跟我有同样需求的小伙伴可 ...

  9. 微信小程序 -- 原生JS集成腾讯IM实时聊天/实时音视频(踩坑及心得)

    原生JS集成腾讯IM实时聊天/实时音视频对话功能 一.腾讯IM集成 前期准备 实例创建及初始化 IM登录 收发消息 二.腾讯音视频实时互动 跑通demo 三.同时集成即时通讯IM 和 音视频直播的 坑 ...

最新文章

  1. mysql 在大型应用中的架构演变
  2. 【Python开发】Python的GUI用法总结
  3. Python的程序结构[4] - 函数/Function[2] - 匿名函数
  4. 新iPhone销量将持续走低 因为旧iPhone够用好几年
  5. Git:本地Git仓库连接码云并新建分支提交
  6. 分享一个MentoHUST for Windows 锐捷认证使用方法,实现不用猎豹wifi第三方流氓软件破解校园网wifi共享限制。
  7. python工程师面试题
  8. NVIDIA Game Ready 显卡驱动517.48发布!为《守望先锋2》做好游戏准备
  9. 驱动精灵w8ndows xp sp2,惠普HP LaserJet 1020打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  10. google站内搜索代码
  11. IDEA Unable to import maven project: See logs for details具体解决方法
  12. 怎样设置用键盘开机?
  13. HDMI热拔插电路举例说明
  14. 一文读懂矩估计、极大似然估计和贝叶斯估计
  15. ktt算法 约化_深度学习面试题
  16. Egret 使用Texture Merger制作美术字体
  17. 用计算机探索ppt,信息技术应用 用计算机画函数图象ppt课件配套教案内容
  18. 教你如何ping指定指定IP的指定端口
  19. 基于JavaWeb的居民户籍管理系统设计与实现
  20. 网页版别踩白块(JavaScript)

热门文章

  1. 动听的音乐在计算机是以,以动听的音乐为话题作文
  2. elgamal加密算法 java_JAVA加解密17-非对称加密算法-ElGamal算法
  3. Mac chrome强制刷新浏览器缓存、firefox强制刷新浏览器缓存
  4. Ubuntu Server系统安装及远程登录
  5. 二阶锥潮流Distfolw(OPF)
  6. Webpack5学习笔记(基础篇五)—— mode之Development环境相关参数配置
  7. sql语句 创建student表 字段属性设置
  8. react-高阶组件
  9. AcWing 4956. 冶炼金属
  10. 基金的购买流程和注意事项