假设我们要自定义一个以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).'
';
}
}