zoukankan      html  css  js  c++  java
  • workerman自定义协议

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

    namespace WorkermanProtocols;
    
    class MyAgreement
    {
        /**
        * 分包
        *
        * 检查客户端传递过来的数据包的完整性
        * 如果得到足够长度的数据包则返回包在buffer中的长度,否则返回0继续等待数据
        * 如果协议有问题可以返回false,客户端会因此断开连接
        *
        * @param $buffer
        * @return int
        */
        public static function input($buffer) {
            //获得换行符
    的位置
            $pos = strpos($buffer,'
    ');
            //如果还没有遇到
    代表数据还未接受完整,此时返回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序列化,并加上换行符
    作为结束的标记
            return json_encode($buffer).'
    ';
        }
    }
    春花秋月何时了?往事知多少。小楼昨夜又东风,故国不堪回首月明中。 雕栏玉砌应犹在,只是朱颜改。问君能有几多愁?恰似一江春水向东流。
  • 相关阅读:
    Alice and Bob 要用到辗转相减
    Java经典设计模式
    设计模式---创建类---建造者模式
    luogu4267 TamingtheHerd (dp)
    nowcoder172C 保护 (倍增lca+dfs序+主席树)
    nowcoder172A 中位数 (二分答案)
    bzoj4985 评分 (二分答案+dp)
    luogu4269 Snow Boots G (并查集)
    luogu4268 Directory Traversal (dfs)
    bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
  • 原文地址:https://www.cnblogs.com/Dengxiaobo/p/14817649.html
Copyright © 2011-2022 走看看