WebSocket实战之————GatewayWorker使用笔记例子

 参考文档:http://www.workerman.net/gatewaydoc/

目录结构

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

!!!特别注意:

[1]客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑。

<script language="javascript" type="text/javascript">
    var $URL = "__APP__/Home/GatewayWorker/bindUid";
    // 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口
    ws = new WebSocket("ws://127.0.0.1:8384");
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
        // json数据转换成js对象
        var data = eval("("+e.data+")");
        var type = data.type || '';
        switch(type){
            // Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
            case 'init':
                // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
                $.post($URL, {client_id: data.clientId}, function(data){}, 'json');
                break;
            default :
                alert(e.data);
        }
    };
</script>

[2]通过GatewayClient发送的数据不会经过Event.php,而是直接经由Gateway进程转发给客户端。GatewayClient无法接收客户端发来的数据。

Gateway::$registerAddress = '127.0.0.1:1236';
$message = [
            'type' => 4002,
            'clientId' => $clientId,
            'publish_time' => date('Y-m-d h:i:s', time())
        ];
Gateway::bindUid($clientId,$uid);
//在这里发送的信息是不走Event.php文件的,直接广播出去了
Gateway::sendToClient($clientId,json_encode($message));

如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。
如果GatewayClient和GatewayWorker在同一台服务器上运行,则不用做任何更改,直接按照示例使用GatewayClient即可。

一、start_gateway.php文件,这个文件是默认的文件,默认协议是text协议:

// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("Text://0.0.0.0:8383");

本地测试text协议是否正常命令:

telnet 127.0.0.1 8383

二、测试结果,启动服务器

输入命令:

telnet 127.0.0.1 8282

重新打开一个窗口:Windows 测试结果:

Linux测试结果:

测试成功:

三、自定义一个Websocket连接

例如:copy一个start_gateway_ws.php文件,如图所示:

修改文件内容:

// gateway_ws 进程
$gateway_ws = new Gateway("Websocket://0.0.0.0:8384");
// gateway名称,status方便查看
$gateway_ws->name = 'YourAppGatewayWS';

在HTMl页面调用:

<script language="javascript" type="text/javascript">
    var $URL = "__APP__/Home/GatewayWorker/bindUid";
    console.log($URL);
    // 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口
    ws = new WebSocket("ws://127.0.0.1:8384");
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
        // json数据转换成js对象
        var data = eval("("+e.data+")");
        var type = data.type || '';
        switch(type){
            case 'init':
               $.post($URL,$data,success,'json');
                break;
            default :
                alert(e.data);
        }
    };

</script>

四、start_businessworker.php文件

注意:以上的HTML页面的WebSocket的端口号必须的同时对应哦!

// 服务注册地址
$worker->registerAddress = '你的外网IP地址:1236';

可以看出:start_register.php这个文件是专门管理其他的三个文件的

注意:一下的register和worker的这个注册地址必须是一样的,也就是说,worker的注册地址必须和register的一样的

// register 服务必须是text协议
$register = new Register('text://0.0.0.0:1236');
// 服务注册地址
$worker->registerAddress = '120.120.120.120:1236';

 例如在TP的Controller中使用的时候这样连接:调用的是这个文件中的地址(服务注册地址):start_businessworker.php

 Gateway::$registerAddress = '120.120.120.120:1236'; //这个链接的地址是start_register.php
 Gateway::bindUid($clientId,$uid);
 Gateway::sendToAll(json_encode($clientId));

 

时间: 2024-07-30 20:31:10

WebSocket实战之————GatewayWorker使用笔记例子的相关文章

WebSocket实战之——JavaScript例子

源码地址:https://github.com/Tinywan/PHP_Experience   一.详细代码案例          详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读.从WebSocket通讯三个阶段(打开握手.数据传递.关闭握手)进行了探讨,各阶段中浏览器和服务器做了些什么事情也有所涉及. //检查浏览器是否支持WebSocket if(wind

WebSocket 实战之——【WebSocket 原理】

一.WebSocket是什么? HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算).         首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解 &amp;amp;amp;amp;amp;amp;amp;

《CSS实战精粹》读书笔记(一)详解

一些有语义的html标签 一些有语义的html标签 是否真的需要div标签?是否真的需要一个class属性? 自打CSS被越来越多的设计人员了解,在页面设计的时候,总是经常含有太多div标签或者是class属性.那么,在真实情况下,这些div标签是否真的有必要?这个class属性是否有必要加?在使用div时,根据上一条规则,你要想一下,在HTML中是否有比div更合适的标签存在,不要过分的迷恋div标签. 不要将单个元素包含进 div 标签中 上面只是书中的一个建议,其实有很多时候我们都并不需要

WebSocket实战之————Workerman服务器的安装启动

 安装php apt-get install php5-cli root@iZ23b64pe35Z:/home/www# php -v PHP 5.5.9-1ubuntu4.20 (cli) (built: Oct 3 2016 13:00:37)  检查pcntl.posix扩展(已经安装成功) root@iZ23b64pe35Z:/home/www# php -m | grep pcntl pcntl root@iZ23b64pe35Z:/home/www# php -m | grep po

使用 HTML5 WebSocket 构建实时 Web 应用

在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas.本地存储.多媒体编程接口.WebSocket 等等.这其中有"Web 的 TCP "之称的 WebSocket 格外吸引开发人员的注意.WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道.Web 开发人员可以非常方便地使用 WebSocket

SEO搜索中文分词算法原理实战教程

SEO搜索中文分词算法原理实战教程,如果一个人想成为一个合格的SEO人员,那么搜索引擎分词思维是必须掌握的,因为只有掌握了分词思维,你才可以做出搜索引擎喜欢,而且用户也喜欢的网页,虽然在梦想之旅视频教程中有和大家分享过搜索引擎中文分词原理,但没有完全的,系统的用文字版本和图片版本和大家分享,那么顾芳源就带大家如何正确学习SEO搜索分词思维吧. 搜索引擎中文分词原理 首先我们要知道搜索引擎工作原理是把每个网页的内容按词来录入到数据库,比如你的文章标题是:梦想SEO实战培训提供免费SEO教程,那么搜

JQuery实战--可以编辑的表格

       廊坊下雪了,15年的第二场雪,比14的来的稍晚一些,停靠在11教门前的自行车,成了廊坊师范学院最美丽的风景线.还记得以前学习css的时候,就曾经接触过如何编写设计一些表格和表单的样式,例如如何设计表格中的颜色,隔行变色等等,相关链接,请点击.        当时学习css的时候,关于表格和表单的所有设置,我们都是在html代码里面实现的,今天小编主要给大家讲解一下,如何利用JQuery+js+css实现表格的编辑.接下来,小编就简单总结一下如何实现这个小例子.         第一

如何使用Go建开发高负载WebSocket服务器

嗨,大家好! 我的名字是Sergey Kamardin,我是Mail.Ru的工程师. 介绍 首先介绍我们的故事的上下文,应该介绍几点我们为什么需要这个服务器. Mail.Ru有很多有状态的系统. 用户电子邮件存储是其中之一. 跟踪系统中的状态变化和系统事件有几种方法. 这主要是通过定期系统轮询或关于其状态变化的系统通知. 两种方式都有利弊. 但是当涉及邮件时,用户收到新邮件的速度越快越好. 邮件轮询涉及每秒大约50,000个HTTP查询,其中60%返回304状态,这意味着邮箱没有变化. 因此,为

WebSocket 开发指南

春节假期看了一下 websocket, 做了一篇笔记, 原文链接: https://oolap.com/websocket     WebSocket 由来已久, 常用于 "服务器推" 场景.最近开始学习 WebSocket (从 tomcat examples 开始), 本文的主要目的是做学习笔记, 同时记录一份开发指南.     本文示例代码见: https://github.com/hanyong/exercise/tree/websocket HTTP 协议简述 我们先来看看