您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman自定义协议-编写于用户目录
发布时间:2021-11-28 22:27:37编辑:雪饮阅读()
之前咱们自定义协议就是直接写在如:\vendor\workerman\workerman\Protocols这个目录中,其实这个是人家workerman自带协议放置的目录,我们放这里不是很妥当的。
那么其实也可以自己定义在同入口脚本同级目录下的一个新增的目录中如直接在入口脚本同目录新增目录Protocols然后在Protocols目录中新增MyTextProtocol.php:
<?php
// 用户自定义协议命名空间统一为Protocols
namespace Protocols;
//简单文本协议,协议格式为 文本+换行
class MyTextProtocol
{
// 分包功能,返回当前包的长度
public static function input($recv_buffer)
{
// 查找换行符
$pos = strpos($recv_buffer, "\n");
// 没找到换行符,表示不是一个完整的包,返回0继续等待数据
if($pos === false)
{
return 0;
}
// 查找到换行符,返回当前包的长度,包括换行符
return $pos+1;
}
// 收到一个完整的包后通过decode自动解码,这里只是把换行符trim掉
public static function decode($recv_buffer)
{
return trim($recv_buffer);
}
// 给客户端send数据前会自动通过encode编码,然后再发送给客户端,这里加了换行
public static function encode($data)
{
return $data."\n";
}
}
那么我们的入口脚本其实几乎没有什么多余的改动start.php:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
/*
* 收到一个完整的数据(结尾是换行)后,自动执行MyTextProtocol::decode('收到的数据')
* 结果通过$data传递给onMessage回调
*/
$text_worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump($data);
/*
* 给客户端发送数据,会自动调用MyTextProtocol::encode('hello world')进行协议编码,
* 然后再发送到客户端
*/
$connection->send("hello world");
};
// run all workers
Worker::runAll();
测试:
服务端:
[root@localhost workerman]# php -c /usr/local/php734/lib/php/php.ini start.php start
Workerman[start.php] start in DEBUG mode
---------------------------------------------- WORKERMAN ----------------------------------------------
Workerman version:4.0.22 PHP version:7.3.4
----------------------------------------------- WORKERS -----------------------------------------------
proto user worker listen processes status
tcp root none myTextProtocol://0.0.0.0:5678 1 [OK]
-------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
string(5) "nihao"
客户端:
[root@localhost ~]# telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
nihao
hello world
关键字词:workerman,自定义协议,用户目录,协议