gatewayworker的环境搭建看我之前的文章
首先,运行start_for_win.bat启动服务
接着配置start_gateway.php文件,确保websocket通信
new Gateway("WebSocket://0.0.0.0:8282");
后端配置好后,用前端连接
直接上前端代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
let yuming = '127.0.0.1'
let ws = new WebSocket("ws://" + yuming + ":8282")
// 当socket连接打开时,输入用户名
ws.onopen = function(e) {
console.log(e, "websocket握手成功,发送登录数据");
}
// 当有消息时根据消息类型显示不同信息
ws.onmessage = function(e) {
console.log(e, "onmessage");
}
</script>
</body>
</html>
如果一切正常的话,控制台运行结果如下
前后端实现正常通信
接下来实现后端发消息给前段
新建控Worker制器
php think make:controller index/Worker
引入GatewayClient
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
// GatewayClient 3.0.0版本以后加了命名空间
use GatewayClient\Gateway;
/**
* === 指定registerAddress表明与哪个GatewayWorker(集群)通讯。===
* GatewayWorker里用Register服务来区分集群,即一个GatewayWorker(集群)只有一个Register服务,
* GatewayClient要与之通讯必须知道这个Register服务地址才能通讯,这个地址格式为 ip:端口 ,
* 其中ip为Register服务运行的ip(如果GatewayWorker是单机部署则ip就是运行GatewayWorker的服务器ip),
* 端口是对应ip的服务器上start_register.php文件中监听的端口,也就是GatewayWorker启动时看到的Register的端口。
* GatewayClient要想推送数据给客户端,必须知道客户端位于哪个GatewayWorker(集群),
* 然后去连这个GatewayWorker(集群)Register服务的 ip:端口,才能与对应GatewayWorker(集群)通讯。
* 这个 ip:端口 在GatewayClient一侧使用 Gateway::$registerAddress 来指定。
*
* === 如果GatewayClient和GatewayWorker不在同一台服务器需要以下步骤 ===
* 1、需要设置start_gateway.php中的lanIp为实际的本机内网ip(如不在一个局域网也可以设置成外网ip),设置完后要重启GatewayWorker
* 2、GatewayClient这里的Gateway::$registerAddress的ip填写填写上面步骤1lanIp所指定的ip,端口
* 3、需要开启GatewayWorker所在服务器的防火墙,让以下端口可以被GatewayClient所在服务器访问,
* 端口包括Rgister服务的端口以及start_gateway.php中lanIp与startPort指定的几个端口
*
* === 如果GatewayClient和GatewayWorker在同一台服务器 ===
* GatewayClient和Register服务都在一台服务器上,ip填写127.0.0.1及即可,无需其它设置。
**/
class Worker extends Controller
{
public function index()
{
$this->send();
return 'wgzimg';
}
public function send(){
Gateway::$registerAddress = '127.0.0.1:1238';
Gateway::sendToAll('hello wgzimg');
}
}
浏览器输入地址 http://127.0.0.1:6666/index/Worker/index
查看聊天室页面
服务端向客户端发送成功