* @copyright walkor * @link http://www.workerman.net/ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ // 这个文件需要单独在compose.json中的autoload->files中引用 // "./jsonnl/Protocol.php" namespace Protocols; /** * RPC 协议解析 相关 * 协议格式为 [json字符串\n] * @author walkor * */ class JsonNL { /** * 检查包的完整性 * 如果能够得到包长,则返回包的在buffer中的长度,否则返回0继续等待数据 * @param string $buffer */ public static function input($buffer) { // 获得换行字符"\n"位置 $pos = strpos($buffer, "\n"); // 没有换行符,无法得知包长,返回0继续等待数据 if ($pos === false) { return 0; } // 有换行符,返回当前包长(包含换行符) return $pos + 1; } /** * 打包,当向客户端发送数据的时候会自动调用 * @param string $buffer * @return string */ public static function encode($buffer) { // json序列化,并加上换行符作为请求结束的标记 return json_encode($buffer) . "\n"; } /** * 解包,当接收到的数据字节数等于input返回的值(大于0的值)自动调用 * 并传递给onMessage回调函数的$data参数 * @param string $buffer * @return string */ public static function decode($buffer) { // 去掉换行,还原成数组 return json_decode(trim($buffer), true); } }