Loading

workerman自定义协议

假设我们要自定义一个以json格式传输,数据边界以换行符\n划分的协议
需要实现三个方法:input分包,decode解包,encode打包
input:负责接受数据并验证是否已经接受完整
decode:负责将数据不解包后传递给业务方法,即onMessage的$data参数
encode:负责将数据发送给客户端时的处理,即send方法
以下为示例

namespace Workerman\Protocols;

class MyAgreement
{
    /**
    * 分包
    *
    * 检查客户端传递过来的数据包的完整性
    * 如果得到足够长度的数据包则返回包在buffer中的长度,否则返回0继续等待数据
    * 如果协议有问题可以返回false,客户端会因此断开连接
    *
    * @param $buffer
    * @return int
    */
    public static function input($buffer) {
        //获得换行符\n的位置
        $pos = strpos($buffer,'\n');
        //如果还没有遇到\n代表数据还未接受完整,此时返回0继续等待
        if($pos===false){
            return 0;
        }
        //有换行符,返回当前包长(+1是包含换行符)
        return $pos+1;
    }

    /**
    * 解包
    *
    * 当接收到的数据字节等于input返回的值(大于0的值)时自动调用
    * 并传递给onMessage回调函数的$data参数
    *
    * @param $buffer
    * @return mixed
    */
    public static function decode($buffer) {
        //去空格后转成数组,
        return json_decode(trim($buffer),true);
    }

    /**
    * 打包
    *
    * 当向客户端发送数据时会自动调用
    *
    * @param $buffer
    * @return string
    */
    public static function encode($buffer) {
        //json序列化,并加上换行符\n作为结束的标记
        return json_encode($buffer).'\n';
    }
}
posted @ 2021-05-27 14:08  木头人4216  阅读(152)  评论(0编辑  收藏  举报