一、文档地址
1、GatewayWorker手册
2、GatewayWorker框架
3、GatewayWorker与TP等框架结合文档
4、配置Nginx支持wss
5、GatewayClient下载
6、创建wss服务
二、服务搭建
1、搭建GatewayWorker服务
下载GatewayWorker框架解压到根目录,修改 GatewayWorker/Application/YourApp/ 目录下三个 'start_' 文件下注册地址一致,start_gateway.php的第24行Gateway括号内容修改为(“websocket://后面的不变”);其他设置如下:
start_gateway.php和start_businessworker.php中的registerAddress地址格式为Register的IP:端口号,其中端口号为start_register.php中的监听端口(假设是1238)
单机部署时,Register服务为本机ip 127.0.0.1,则start_gateway.php和start_businessworker.php中的registerAddress统一为'127.0.0.1:1238'
分布式(集群)部署时,IP为实际Register服务部署的IP(分布式部署时只需要部署一台Register服务即可,假设是192.168.1.100),
则start_gateway.php和start_businessworker.php中的registerAddress统一为'192.168.1.100:1238'
2、Nginx 配置域名支持 ws/wss ws/wss说明
-配置HTTP域名的位置加如下配置:
location /ws {
proxy_pass http://127.0.0.1:8282;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
-配置HTTPS域名的位置加如下配置:
location /wss {
proxy_pass http://127.0.0.1:8282;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
proxy_pass 地址是 搭建GatewayWorker服务器IP地址、端口和gateway 进程(start_gateway.php文件)端口保持一致
3、客户端请求方式
-http方式请求
## js 为例
ws = new WebSocket("ws://127.0.0.1:8282”);
ws = new WebSocket("ws://your_domain.com/ws”);
## /ws是为了方便配置nginx
-https方式请求
## js 为例
ws = new WebSocket("wss://127.0.0.1:8282");
## 有SSL 协议存在需要使用域名访问方式 不然会报错
wss = new WebSocket("wss://your_domain.com/wss");
## /wss是为了方便配置nginx
4、启动/停止gateway服务 文档
## 需要进入到 GatewayWorker 框架根目录
## debug方式启动
php start.php start
## 以daemon方式启动
php start.php start -d
## 停止
php start.php stop
## 重启
php start.php restart
## 查看状态
php start.php status
5、测试服务
## js测试服务是否正常
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>Demo测试</div>
<input id="im1" type="text" name="输入消息">
<input id="im2" type="button" value="发送" onclick="sendMsg();" />
<div id="im"></div>
<script type="text/javascript">
// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://your_domain.com/wss");
ws.onmessage = function(e) {
var html = document.getElementById('im').innerText;
document.getElementById('im').innerText = html + e.data;
//alert("收到服务端的消息:" + e.data);
};
ws.onopen = function() {
ws.send("开始聊天吧!");
};
function sendMsg() {
var msg = document.getElementById('im1').value;
ws.send(msg);
}
</script>
</body>
</html>
-可打开两个浏览器互发消息、测试效果如下:
三、与TP框架整合
2、注册地址
GatewayClient下的registerAddress地址和端口要和 GatewayWorker 下的保持一致
3、客户端与TP的交互
-客户端建立与GatewayWorker的websocket连接
-GatewayWorker发现有连接发起时,将对应连接的client_id发给客户端
-客户端收到client_id后触发一个请求TP接口将client_id发到后端进行用户ID的绑定
-后端收到client_id后利用bindUid将client_id与当前uid(用户/客户端唯一标识)绑定
-客户端发起的所有请求都直接POST/GET到TP框架统一处理,包括发送消息
-TP框架处理业务过程中需要向某个uid或者某个群组发送数据时,直接调用sendToUid、sendToGroup 等发送即可
4、心跳检测
客户端定时每X秒(推荐小于60秒)向服务端发送特定数据,服务端设定为X秒没有收到客户端心跳则认为客户端掉线,并关闭连接触发onClose回调