|
|
本帖最后由 win 于 2023-11-24 10:22 编辑
原文地址:https://blog.csdn.net/weixin_44871749/article/details/122325581
我经过踩坑改良的,gatewayclient也放到TP目录下
tp5.1就不多讲了,没有TP5.1基础和composer就别搞了,我只是踩完坑了。
我重要是说服务器端口的事。
只针对windows系统!!!!!!!!!!
TP5.1安装,有得就略过
composer create-project topthink/think=5.1.* tp5
1.去官方下载getway
https://www.workerman.net/doc/gateway-worker/
下载后直接解压到tp5.1里即可,和application同级目录,看图
2.安装gatewayClient,建议使用composer
composer require workerman/gatewayclient
官网地址:http://workerman.net/doc/gateway ... t%E5%AE%89%E8%A3%85
我是用composer安装得,自己安装得位置自己找,我把我安装得截个图。
3.打开GatewayWorker\Applications\YourApp下的start_gateway.php文件
下面是start_getway.php文件,里面用到了ssl,如果没有证书请直接使用
$gateway = new Gateway("Websocket://0.0.0.0:9501");
去掉$gateway->transport = 'ssl';
我有证书
代码如下
<?php
/**
* This file is part of workerman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
$context = array(
// 更多ssl选项请参考手册 https://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径,我这里是复制apache里的绝对路径,他也报错,但是能连接上。
'local_cert' => 'D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl/www.huaheyun.cn.crt', //.crt
'local_pk' => 'D:/phpstudy_pro/Extensions/Apache2.4.39/conf/ssl/www.huaheyun.cn.key', //.key
'verify_peer' => false,
'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// gateway 进程,这里使用Text协议,可以用telnet测试,这里必须为0.0.0.0
$gateway = new Gateway("Websocket://0.0.0.0:9501",$context);//设置transport开启ssl,websocket+ssl即wss
$gateway->transport = 'ssl';
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// // gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1236';
//以上内容不要去更改,除了9501和1236端口以外,关于端口,在防火墙里添加入口规则,协议是TCP,9501是外网用,1236是内网用,我用的是华为云,在控制台-安全组里的入口向规则也添加了。
// 心跳间隔
$gateway->pingInterval = 55;
$gateway->pingNotResponseLimit = 1;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
// $gateway->onConnect = function($connection)
// {
// $connection->onWebSocketConnect = function($connection , $http_header)
// {
// // 可以在这里判断连接来源是否合法,不合法就关掉连接
// // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
// if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
// {
// $connection->close();
// }
// // onWebSocketConnect 里面$_GET $_SERVER是可用的
// // var_dump($_GET, $_SERVER);
// };
// };
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
4.更改Events.php,修改业务逻辑<?php use \GatewayWorker\Lib\Gateway; class Events{ /** * 每当有客户端连接时,向该客户端发送$client_id,让客户端进行初始化. */ public static function onConnect($client_id) { $resData = [ 'type' => 'init', 'client_id' => $client_id, 'msg' => 'connect is success' // 初始化房间信息 ]; Gateway::sendToClient($client_id, json_encode($resData)); } /** * 该方法不用添加任何业务处理,所有的业务处理都交给thinkphp5.1的控制器Service里处理! */ public static function onMessage($client_id,$message){ echo "onMessage:".$client_id.$message."\r\n"; } /** * 当客户端断开连接时触发 */ public static function OnClose($client_id){ $msg='{"type":"onclose","client_id":"'.$client_id.'","time":"'.date('Y-m-d H:i:s').'"}'; echo $msg."\r\n"; }}
5.运行start_for_win.bat文件6.autoloda.php文件
vendor.zip
(752 Bytes, 下载次数: 228)
7.测试链接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Websocket 测试</title>
</head>
<body>
<h1>Websocket 测试</h1>
</body>
<script>
//修改成你的自己的网址
ws = new WebSocket("wss://www.imztk.cc:9501");
ws.onopen = function() {
console.log("连接成功");
ws.send('tom');
console.log("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
console.log("收到服务端的消息:" + e.data);
};
// ws.send('保持连接,发第二次信息,查看服务器回应');
</script>
</html>
|
|