在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
兄弟牛拜啊,自定义协议,那你系统底层做了吗?你只是应用层了,那你系统底层做了吗?
现在还很多人都没有理解http跟websocket二个协议有什么区别呢
大哥,我没做啥。我就是照抄了官方例子运行,就是在webman里使用自定义进程的方式再使用自定义协议不会报错但是没有作用了。
自定义进程没毛病,但自定义协议麻烦你百度一下,协议是全球标准化的
emm,我说的协议是这个通讯协议。https://www.workerman.net/doc/workerman/protocols/how-protocols.html
这样写默认是tcp协议,按照workerman文档应该是
感谢大佬帮忙!刚尝试了下可以正常使用了。我没在官方手册里看到有protocol这个参数,所以我偷了个鸡,在UdpServer类onWorkerStart函数中加了$worker->protocol = 'Protocols\JsonNL' 这个方法也是OK的。不过没大佬这个官方。
个人感觉webman里的自定义进程的文档不是很完善。:)
protocol协议设置手册在这里 https://www.workerman.net/doc/workerman/worker/protocol.html
webman自定义进程实际就是workerman的用法,看workerman手册就行了,webman手册里再写一遍workerman手册的内容感觉也不好
好的 感谢大佬帮忙