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));
WebSocket实战之————GatewayWorker使用笔记例子的更多相关文章
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver
1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...
- Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥
1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...
- #Spring实战第二章学习笔记————装配Bean
Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...
- Spring实战第一章学习笔记
Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...
- MySQL实战45讲学习笔记:第三十九讲
一.本节概况 MySQL实战45讲学习笔记:自增主键为什么不是连续的?(第39讲) 在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧 ...
- 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- C# WebApi+Task+WebSocket实战项目演练(四)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- 基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
https://www.cnblogs.com/wt645631686/p/7366924.html 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交 ...
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
随机推荐
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐 ...
- 蓝牙协议栈记录—BTStack
TSTack User Guid 翻译过来的 1.简介 2.BTStack 架构 BTStack在所实现的协议和服务之间采用很多状态机实现相互作用,特点: <1>单线程.BTStack只有 ...
- HDFS的概念
1.数据块 每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位.构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍.文件系统快一半为几千字 ...
- js基础细节
js细节 1.所有的全局变量都是window的属性. 语句 var a=1; 等价于 window.a=1; 用 "变量名称" in window 来验证全局变量是否声明. 2.所 ...
- JavaMail邮件开发
一.只带有纯文本的邮件 代码事例如下: package com.lyh.sendemail; import java.util.Properties; import javax.mail.Messag ...
- C++笔记----构造函数与析构函数(二)
构造函数是一种特殊的成员函数.在创建对象的时候自动调用,对对象的数据成员进行初始化. (1)栈区中创建的对象,在生存期结束的时候会自动调用析构函数. (2) 在堆上创建的对象,要由程序员显示调用del ...
- ExtJs 使用点滴 十三 在FormPanel 嵌入按钮
Ext.onReady(function () { //初始化标签中的Ext:Qtip属性. Ext.QuickTips.init(); Ext.form.Field.prototype.msgTar ...
- ionic安装指定版本
npm install -g ionic@1.4.0 原文地址:http://stackoverflow.com/questions/30316994/how-to-install-specific- ...
- ios - 自动布局框架编写(更多功能完善中)
之前用的storyboard以及xib挺多的,最近看到朋友用第三方框架---自动布局约束框架在添加控件约束的时候老实报错.后来自己就试了试纯代码创建以及约束控件.但是纯代码约束一个控件还可以,如果约束 ...
- [HTML5]移动开发不同手机弹出数字键盘问题
这里还是先那么先交代一下遇到的问题.其实无论是tel还是number都不是完美的:type="tel"优点是iOS和Android的键盘表现都差不多缺点是那些字母好多余,虽然我没有 ...