webman中的自定义进程使用自定义协议没有作用

麻麻瓜

问题描述

在webman中自定义协议JsonNL后,在协议类里的input打印了1,在UdpServer类onMessage也打印1,使用第三方工具传输数据时候不会触发1,在onMessage里也不会触发。
但是我把

'listen'  => 'JsonNL://0.0.0.0:9002'

改回

'listen'  => 'udp://0.0.0.0:9002'

之后onMessage中的1会在命令行里被打印出来。至少说明在配置自定义协议之前应该是没有问题的。

求大哥帮忙!

操作步骤如下

先在process.php配置了进程

'udpserver' => [
        // UdpServer
        'handler' => app\UdpServer::class,
        'listen'  => 'JsonNL://0.0.0.0:9002',
        'count'   => 1,
    ],

然后在app目录下创建了UdpServer.php

namespace app;

use Channel;

$group_con_map = array();
class UdpServer
{
    public function onWorkerStart($worker){
        // Channel客户端连接到Channel服务端
        Channel\Client::connect('127.0.0.1', 2206);
    }

    public function onMessage($con, $json)
    {
        var_dump(1);
    }
}

在根目录下的Protocols文件下新建了JsonNL.php。使用的官方示例删除注释好看一点。

//这个是协议类
namespace Protocols;

class JsonNL
{
    public static function input($buffer)
    {
        var_dump(1);
         // 获得换行字符"\n"位置
        $pos = strpos($buffer, "\n");
        // 没有换行符,无法得知包长,返回0继续等待数据
        if($pos === false)
        {
            return 0;
        }
        // 有换行符,返回当前包长(包含换行符)
        return $pos+1;
    }

    public static function encode($buffer)
    {
        // json序列化,并加上换行符作为请求结束的标记
        return json_encode($buffer)."\n";
    }
    public static function decode($buffer)
    {
        // 去掉换行,还原成数组
        return json_decode(trim($buffer), true);
    }
}

操作系统是win10
php是8.0
composer是2.6.5

329 2 0
2个回答

darcy

兄弟牛拜啊,自定义协议,那你系统底层做了吗?你只是应用层了,那你系统底层做了吗?

现在还很多人都没有理解http跟websocket二个协议有什么区别呢

six
'listen'  => 'JsonNL://0.0.0.0:9002',

这样写默认是tcp协议,按照workerman文档应该是

'listen'  => 'udp://0.0.0.0:9002',
'protocol' => \Protocols\JsonNL::class
  • 麻麻瓜 2024-02-24

    感谢大佬帮忙!刚尝试了下可以正常使用了。我没在官方手册里看到有protocol这个参数,所以我偷了个鸡,在UdpServer类onWorkerStart函数中加了$worker->protocol = 'Protocols\JsonNL' 这个方法也是OK的。不过没大佬这个官方。

  • 麻麻瓜 2024-02-24

    个人感觉webman里的自定义进程的文档不是很完善。:)

  • six 2024-02-24

    protocol协议设置手册在这里 https://www.workerman.net/doc/workerman/worker/protocol.html
    webman自定义进程实际就是workerman的用法,看workerman手册就行了,webman手册里再写一遍workerman手册的内容感觉也不好

  • 麻麻瓜 2024-02-24

    好的 感谢大佬帮忙

🔝