Error package. package_length=falseError 问题咨询

shanyi

问题描述

环境:Linux
webman/gateway-worker v1.0.8
webman/think-orm v1.1.1
workerman/gateway-worker v3.1.1
workerman/http-client v2.0.1
workerman/psr7 v1.4.6
workerman/webman-framework v1.5.13
workerman/workerman v4.1.13

如题所示,我是在webman用使用的GatewayWorker,使用了自定义协议。我查询了社区帖子说出现这个错误是错误包导致的。但是我现在这个情况不是必显。有时候logs日志会记录有时候没有

程序代码

process.php 代码

<?php
use Webman\GatewayWorker\Gateway;
use Webman\GatewayWorker\BusinessWorker;
use Webman\GatewayWorker\Register;
return [
    '4gateway' => [
        'handler'     => Gateway::class,
        'listen'      => 'Fournetwork://0.0.0.0:7474',
        'count'       => cpu_count(),
        'reloadable'  => false,
        'constructor' => ['config' => [
            'lanIp'           => '127.0.0.1',
            'startPort'       => 2400,
            'pingInterval'    => 120,
            'pingData'        => '',
            'pingNotResponseLimit'=>1,
            'registerAddress' => '127.0.0.1:1238',
            'onConnect'       => function(){},
        ]]
    ],
    '4worker' => [
        'handler'     => BusinessWorker::class,
        'count'       => cpu_count()*2,
        'constructor' => ['config' => [
            'eventHandler'    => plugin\webman\gateway\Events::class,
            'name'            => 'FourChatBusinessWorker',
            'registerAddress' => '127.0.0.1:1238',
        ]]
    ],
    '4register' => [
        'handler'     => Register::class,
        'listen'      => 'text://127.0.0.1:1238',
        'count'       => 1, // Must be 1
        'constructor' => []
    ],
];

自定义协议代码
Fournetwork.php 代码(位置在:根目录\Protocols)

<?php
namespace Protocols;

class Fournetwork
{
    /**
     * 检查包的完整性
     * 如果能够得到包长,则返回包的在buffer中的长度,否则返回0继续等待数据
     * 如果协议有问题,则可以返回false,当前客户端连接会因此断开
     * @param string $buffer
     * @return int
     */
    public static function input($buffer)
    {
        // 16进制数据转换
        $str = bin2hex($buffer);
        $pos = strpos($str, "fe");
        // 无法得知包长,返回0继续等待数据
        if ($pos === false) {
            return false;
        }
        // 返回包的长度
        return strlen($buffer);
    }

    /**
     * 打包,当向客户端发送数据的时候会自动调用
     * @param string $buffer
     * @return string
     */
    public static function encode($buffer)
    {
        // 这里可以对数据进行处理,然后返回处理后的数据
        return $buffer;
    }

    /**
     * 解包,当接收到的数据字节数等于input返回的值(大于0的值)自动调用
     * 并传递给onMessage回调函数的$data参数
     * @param string $buffer
     * @return string
     */
    public static function decode($buffer)
    {
        // 这里可以对数据进行解析,然后返回解析后的数据
        return $buffer;
    }
}

报错信息

日志记录的报错信息

Error package. package_length=falseError 

备注说明

因为我是跟硬件对接的,所以发送的包都是hex2bin后的数据
格式如下:

$sendData = hex2bin('发送的数据');
Gateway::sendToClient($client_id, $sendData);
258 1 0
1个回答

meows
    /**
     * 检查包的完整性
     * 如果能够得到包长,则返回包的在buffer中的长度,否则返回0继续等待数据
     * 如果协议有问题,则可以返回false,当前客户端连接会因此断开
     * @param string $buffer
     * @return int
     */
    public static function input($buffer)
    {
        // 16进制数据转换
        $str = bin2hex($buffer);
        $pos = strpos($str, "fe");
        // 无法得知包长,返回0继续等待数据
        if ($pos === false) {
            return false;
        }
        // 返回包的长度
        return strlen($buffer);
    }

$pos === false 你要改成0,不能是布尔值。

  • 暂无评论
🔝