gateway-worker 在 thinkphp6中 怎么自定义协议

左手哥
'businessWorker'        => [
    'eventHandler' => 'app\controller\Events'
],

然后在Events中 源代码是这样写的,结合workman的自定义文档 请问这里怎么调用自定义协议代码

public static function onMessage($client_id, $data)
{  

} 

此处是文档中的方法,但是结合我现有代码无法引入进来,谢谢

$json_worker = new Worker('JsonNL://0.0.0.0:1234');
$json_worker->onMessage = function(TcpConnection $connection, $data) {

    // $data就是客户端传来的数据,数据已经经过JsonNL::decode处理过
    echo $data;

    // $connection->send的数据会自动调用JsonNL::encode方法打包,然后发往客户端
    $connection->send(array('code'=>0, 'msg'=>'ok'));

};
2215 2 0
2个回答

walkor 打赏

给你的composer.json 里的autoload.files 选项里加上你的协议类的加载路径。类似这种

"autoload": {
    "psr-4": {
      "" : "./"
    },
    "files": [
      "你的协议类路径"
    ]
  }

然后执行 composer dumpautoload

如果实在不会就手动require文件吧。

  • liziyu 2022-01-06

    tp6可以直接放到 extend目录并设置好namespace,然后项目任何地方都可以直接new了。

leesaijyun
  1. 使用composer require workerman/gateway-worker 安装Linux版本的gateway

  2. 创建一个自定义协议类

    <?php
    namespace app\gateway\protocols;
    use Workerman\Connection\ConnectionInterface;
    class Custom {
    public static function input($buffer, ConnectionInterface $connection) {}
    public static function decode($buffer, ConnectionInterface $connection) {}
    public static function encode($data) {}
    }
  3. 再创建启动服务的文件Run.php

    <?php
    namespace app\gateway\controller;
    use think\Controller;
    use Workerman\Worker;
    use GatewayWorker\Register;
    use GatewayWorker\BusinessWorker;
    use GatewayWorker\Gateway;
    class Run {
    public function __construct()
    {
        // 初始化register
        new Register('text://0.0.0.0:1236');
    
        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = 'RoomBusinessWorker';
        $worker->count = 4;
        $worker->registerAddress = '127.0.0.1:1236';
    
        // 设置处理业务的类,此处制定Events的命名空间
        $worker->eventHandler = '\app\gateway\controller\Events';
        // 初始化 gateway 进程
        $gateway = new Gateway("websocket://0.0.0.0:7272");
        $gateway->name = 'RoomGateway';
         $gateway->protocol = Custom::class;    //应用层协议,这里用上面的那个文件
        $gateway->count = 4;
        $gateway->lanIp = '127.0.0.1';
        $gateway->startPort = 2900;
        $gateway->registerAddress = '127.0.0.1:1236';
    
        // 运行所有Worker;
        Worker::runAll();
    }
    }
  4. 发送消息处理Events.php

    <?php
    namespace app\gateway\controller;
    use GatewayWorker\Lib\Gateway;
    use think\Controller;
    class Events extends Controller
    {
    /**
     * 有消息时
     * @param integer $client_id 连接的客户端
     * @param mixed $message
     * @return void
     */
    public static function onMessage($client_id, $message){}
    /**
     * 当客户端断开连接时
     * @param integer $client_id 客户端id
     */
    public static function onClose($client_id) {}
    
    /**
     * 当用户连接时触发的方法
     * @param integer $client_id 连接的客户端
     * @return void
     */
    public static function onConnect($client_id) { }
    
    /**
     * 当用户断开连接时触发的方法
     * @param integer $client_id 断开连接的客户端
     * @return void
     */
    //    public static function onClose($client_id)
    //    {
    //        Gateway::sendToAll("client[$client_id] logout\n");
    //    }
    
    /**
     * 当进程启动时
     * @param integer $businessWorker 进程实例
     */
    public static function onWorkerStart($businessWorker) {
        echo "WorkerStart\n";
    }
    
    /**
     * 当进程关闭时
     * @param integer $businessWorker 进程实例
     */
    public static function onWorkerStop($businessWorker) {
        echo "WorkerStop\n";
    }
    }
  5. 最后再根目录创建gateway.php启动方便启动

    <?php
    // [ 应用入口文件 ]
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/application/');
    define('BIND_MODULE','gateway/Run');
    // 加载框架引导文件
    require __DIR__ . '/thinkphp/start.php';
  6. 根目录cmd执行:php gateway.php start启动服务
    代码对齐有点乱 , 将就着看吧

  • 暂无评论
年代过于久远,无法发表回答
×
🔝