国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

求解數(shù)據(jù)粘包問題,使用text協(xié)議

defeatlr

系統(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í)在不知道原因

4117 1 0
1個(gè)回答

Alu

我以前也遇到這個(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);

    }
  • defeatlr 2018-01-04

    感謝指導(dǎo)!不過在群里問了下walkor他說在終端打印出來(lái)這樣是正常的,順序錯(cuò)亂了不算粘包,我看了下寫到redis數(shù)據(jù)確實(shí)也是對(duì)的只是1秒發(fā)200條的情況下我沒有仔細(xì)去核對(duì)過

年代過于久遠(yuǎn),無(wú)法發(fā)表回答
??