環(huán)境: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,使用了自定義協(xié)議。我查詢了社區(qū)帖子說(shuō)出現(xiàn)這個(gè)錯(cuò)誤是錯(cuò)誤包導(dǎo)致的。但是我現(xiàn)在這個(gè)情況不是必顯。有時(shí)候logs日志會(huì)記錄有時(shí)候沒(méi)有
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' => []
],
];
自定義協(xié)議代碼
Fournetwork.php 代碼(位置在:根目錄\Protocols)
<?php
namespace Protocols;
class Fournetwork
{
/**
* 檢查包的完整性
* 如果能夠得到包長(zhǎng),則返回包的在buffer中的長(zhǎng)度,否則返回0繼續(xù)等待數(shù)據(jù)
* 如果協(xié)議有問(wèn)題,則可以返回false,當(dāng)前客戶端連接會(huì)因此斷開(kāi)
* @param string $buffer
* @return int
*/
public static function input($buffer)
{
// 16進(jìn)制數(shù)據(jù)轉(zhuǎn)換
$str = bin2hex($buffer);
$pos = strpos($str, "fe");
// 無(wú)法得知包長(zhǎng),返回0繼續(xù)等待數(shù)據(jù)
if ($pos === false) {
return false;
}
// 返回包的長(zhǎng)度
return strlen($buffer);
}
/**
* 打包,當(dāng)向客戶端發(fā)送數(shù)據(jù)的時(shí)候會(huì)自動(dòng)調(diào)用
* @param string $buffer
* @return string
*/
public static function encode($buffer)
{
// 這里可以對(duì)數(shù)據(jù)進(jìn)行處理,然后返回處理后的數(shù)據(jù)
return $buffer;
}
/**
* 解包,當(dāng)接收到的數(shù)據(jù)字節(jié)數(shù)等于input返回的值(大于0的值)自動(dòng)調(diào)用
* 并傳遞給onMessage回調(diào)函數(shù)的$data參數(shù)
* @param string $buffer
* @return string
*/
public static function decode($buffer)
{
// 這里可以對(duì)數(shù)據(jù)進(jìn)行解析,然后返回解析后的數(shù)據(jù)
return $buffer;
}
}
日志記錄的報(bào)錯(cuò)信息
Error package. package_length=falseError
因?yàn)槲沂歉布?duì)接的,所以發(fā)送的包都是hex2bin后的數(shù)據(jù)
格式如下:
$sendData = hex2bin('發(fā)送的數(shù)據(jù)');
Gateway::sendToClient($client_id, $sendData);
/**
* 檢查包的完整性
* 如果能夠得到包長(zhǎng),則返回包的在buffer中的長(zhǎng)度,否則返回0繼續(xù)等待數(shù)據(jù)
* 如果協(xié)議有問(wèn)題,則可以返回false,當(dāng)前客戶端連接會(huì)因此斷開(kāi)
* @param string $buffer
* @return int
*/
public static function input($buffer)
{
// 16進(jìn)制數(shù)據(jù)轉(zhuǎn)換
$str = bin2hex($buffer);
$pos = strpos($str, "fe");
// 無(wú)法得知包長(zhǎng),返回0繼續(xù)等待數(shù)據(jù)
if ($pos === false) {
return false;
}
// 返回包的長(zhǎng)度
return strlen($buffer);
}
$pos === false 你要改成0,不能是布爾值。