环境: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);
$pos === false 你要改成0,不能是布尔值。