系統(tǒng)內(nèi)核已參照手冊(cè)優(yōu)化,php7 已安裝event擴(kuò)展
硬件發(fā)送的數(shù)據(jù)格式
send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000,結(jié)束符號(hào)是\r\n
客戶端測(cè)試代碼
function connect()
{
static $count = 0;
if ($count++ >= 100) return;
$con = new AsyncTcpConnection('text://xxxxx:8282');
$con->onConnect = function ($con) {
// 遞歸調(diào)用connect
connect();
};
$con->onMessage = function ($con, $msg) {
echo "recv $msg\n";
};
$con->onClose = function ($con) {
echo "con close\n";
};
Timer::add(1, function () use ($con) {
// $data = "send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000" . "\r\n";
// for ($i=0;$i<200;$i++){
// $data .= "send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000" . "\r\n";
// }
$data = "send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000" . "\r\n" . "send 2000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000" . "\r\n";
$con->send($data);
});
$con->connect();
echo $count, "connections complete\n";
}
協(xié)議部分復(fù)制了text的協(xié)議,就改了下input方法
public static function input($buffer, TcpConnection $connection)
{
if (strlen($buffer) >= TcpConnection::$maxPackageSize) {
$connection->close();
return 0;
}
// 獲得換行字符"\n"位置
$pos = strpos($buffer, "\r\n");
// 沒有換行符,無(wú)法得知包長(zhǎng),返回0繼續(xù)等待數(shù)據(jù)
if ($pos === false) {
return 0;
}
// 有換行符,返回當(dāng)前包長(zhǎng)(包含換行符)
return $pos + 2;
}
Event.php onMessage方法
public static function onMessage($client_id, $message)
{
var_dump($client_id . '-' .$message);
}
運(yùn)行幾秒后會(huì)出現(xiàn)兩個(gè)不同連接的數(shù)據(jù)粘一起了
string(88) "ac102fe80b5500000048-send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000"
string(88) "ac102fe80b5500000048-send 4000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000"
string(88) "string(88) "ac102fe80b5500000048-send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000ac102fe80b5500000049-send 1000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000"
"
string(88) "ac102fe80b5500000049-send 4000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000"
如果客戶端發(fā)送的數(shù)據(jù)改為200,打印出來(lái)直接就全部粘一起了
請(qǐng)問,為什么會(huì)出現(xiàn)這種情況?用text協(xié)議也試了,社區(qū)里問題都看遍了 ,實(shí)在不知道原因
我以前也遇到這個(gè)問題,我是這樣處理的,給你參考一下:
同一個(gè)連接10ms發(fā)送一條,測(cè)試一分鐘發(fā)送接收6000多條接收無(wú)誤;
public static function onMessage($Client_id, $Message)
{
global $global;
if (! $Message) {
return $global->message = null;
}
if (isset($global->message)) {
$Message = $global->message . $Message;
}
if (! isset($Message)) {
$global->message = $Message;
}
$Message = json_decode($Message, true);
}
感謝指導(dǎo)!不過在群里問了下walkor他說在終端打印出來(lái)這樣是正常的,順序錯(cuò)亂了不算粘包,我看了下寫到redis數(shù)據(jù)確實(shí)也是對(duì)的只是1秒發(fā)200條的情況下我沒有仔細(xì)去核對(duì)過