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

workerman在接收大數(shù)據(jù)的時(shí)候(也沒(méi)多大也就36k左右),為什么出現(xiàn)了數(shù)據(jù)分段情況

lxy

這是我寫(xiě)的程序一部分,接收到數(shù)據(jù)通過(guò)bin2hex轉(zhuǎn)換之后打印數(shù)據(jù),為了驗(yàn)證是分段我加了sssss標(biāo)識(shí)
[attach]2471[/attach]
下面是結(jié)果圖

[attach]2472[/attach]
....
[attach]2473[/attach]
?

3351 3 0
3個(gè)回答

jis

tcp本來(lái)就是分段傳輸,沒(méi)毛病

  • lxy 2019-10-16

    我要是想將這個(gè)整個(gè)數(shù)據(jù)存到數(shù)據(jù)庫(kù),應(yīng)該怎么處理哪

jis

弄個(gè)通訊協(xié)議,發(fā)數(shù)據(jù)的時(shí)候按照協(xié)議格式發(fā)。
比如 workerman的text協(xié)議,格式就是數(shù)據(jù)末尾加一個(gè)換行符"\n",注意PHP里是雙引號(hào)。
?
workerman的話就是 $tcp_worker = new Worker('text://0.0.0.0:1234');
?
客戶(hù)端發(fā)數(shù)據(jù)的話在末尾加一個(gè)換行符來(lái)表示數(shù)據(jù)包結(jié)束。PHP代碼類(lèi)似:
$client = stream_socket_client('tcp://127.0.0.1:1234');
// 注意,text協(xié)議格式是數(shù)據(jù)末尾加換行符 "\n",注意是雙引號(hào),之前吃過(guò)這個(gè)虧
fwirte($client, '36K數(shù)據(jù)'."\n");
?
按照服務(wù)端的協(xié)議格式發(fā)就能完整接收了。當(dāng)然你可以定義其它協(xié)議,workerman文檔里有定義方法,自定義協(xié)議我還沒(méi)用過(guò)。
http://doc.workerman.net/protocols/why-protocols.html
http://doc.workerman.net/protocols/why-protocols.html
http://doc.workerman.net/protocols/example.html

lxy

問(wèn)題已經(jīng)解決
問(wèn)題原因:tcp協(xié)議本身是分段傳輸?shù)?,這個(gè)傳輸?shù)拇笮】赡芫褪菐资甼左右。
解決方法:需要自定義通訊協(xié)議(其原理還是基于tcp傳輸,只是在接收數(shù)據(jù)的時(shí)候進(jìn)行了判斷)
自定義協(xié)議方法:http://doc.workerman.net/protocols/how-protocols.html
自定義協(xié)議代碼:

<?php
namespace Workerman\Protocols;

/**
 * Lxy Protocol.
 */
class Lxy
{

    // workerman接收數(shù)據(jù)的過(guò)程(workerman手冊(cè)上有描述,在定制通訊協(xié)議那里) 
    //1、假設(shè)客戶(hù)端發(fā)送一個(gè)數(shù)據(jù)包給服務(wù)端,服務(wù)端收到數(shù)據(jù)(可能是部分?jǐn)?shù)據(jù))后會(huì)立刻調(diào)用協(xié)議的 input 方法,用來(lái)檢測(cè)這個(gè)包的長(zhǎng)度,input方法會(huì)返回?cái)?shù)據(jù)包長(zhǎng)度$length(也就是通訊協(xié)議告訴workerman框架我要這么長(zhǎng)的數(shù)據(jù))
    // 2、workerman框架會(huì)判斷當(dāng)前緩沖區(qū)里面有沒(méi)有這么長(zhǎng)的數(shù)據(jù),如果沒(méi)有就繼續(xù)等待,直到數(shù)據(jù)長(zhǎng)度達(dá)到要求。
    // 3、然后框架會(huì)從緩沖區(qū)中取出這么長(zhǎng)的數(shù)據(jù),調(diào)用decode方法,decode方法就是將數(shù)據(jù)進(jìn)行處理,處理完成之后將數(shù)據(jù)return到onMessage,這樣我們就可以在onMessage編寫(xiě)業(yè)務(wù)代碼了。

    //定義自己要接收到的數(shù)據(jù)有多長(zhǎng)
    const PACKAGE_LEN = 36018;
    public static function input($recv_buffer)
    {
        // $recv_buffer 接收到的數(shù)據(jù)
        // $data_len 獲取當(dāng)前的數(shù)據(jù)長(zhǎng)度
        $data_len = strlen($recv_buffer);
        // 如果不夠數(shù)據(jù)長(zhǎng)度,則繼續(xù)等待
        if($data_len &lt; self::PACKAGE_LEN)
        {
            return 0;
        }
        // 數(shù)據(jù)達(dá)到長(zhǎng)度,返回包長(zhǎng),這里返回的包長(zhǎng),相當(dāng)于告訴decode方法,要從緩沖區(qū)中取出這么長(zhǎng)的數(shù)據(jù)
        return $data_len;
        //================================================
            // //這里是我的項(xiàng)目中需要傳輸二進(jìn)制數(shù)的邏輯,如果你只是傳輸較長(zhǎng)的字符串,這里可以不用看
            // // 我的項(xiàng)目中,是硬件設(shè)備通過(guò)tcp協(xié)議傳輸數(shù)據(jù),硬件方面?zhèn)鬏數(shù)臅r(shí)候是16進(jìn)制,但是不知道為什么經(jīng)過(guò)tcp之后變成了二進(jìn)制(這里沒(méi)有管他,接收到之后直接由二進(jìn)制轉(zhuǎn)成十六進(jìn)制)
            // $recv_buffer = bin2hex($recv_buffer);//二進(jìn)制轉(zhuǎn)十六進(jìn)制
            // $data_len = strlen($recv_buffer);//獲取轉(zhuǎn)化之后的長(zhǎng)度
            // // 如果不夠數(shù)據(jù)長(zhǎng)度,則繼續(xù)等待
            // if($data_len &lt; self::PACKAGE_HEAD_LEN)
            // {
            //     return 0;
            // }
            // // 返回包長(zhǎng),注意:這里返回的時(shí)候又將數(shù)據(jù)從二進(jìn)制轉(zhuǎn)成了十六進(jìn)制了,因?yàn)槎M(jìn)制和十六進(jìn)制的長(zhǎng)度不同,decode方法里面要處理的數(shù)據(jù)是剛傳來(lái)時(shí)的二進(jìn)制數(shù),所以這里要轉(zhuǎn)回二進(jìn)制
            // $data_len = strlen(hex2bin($recv_buffer));
            // return $data_len;
        // =================================================
    }

    /**
     * Decode.
     *
     * @param string $buffer
     * @return string
     */
    public static function decode($recv_buffer)
    {
        // $recv_buffer : 根據(jù)返回的包長(zhǎng),從緩沖區(qū)中獲取數(shù)據(jù)
        // 測(cè)試過(guò)程中如果不知道哪里出問(wèn)題了可以將數(shù)據(jù)放到文件中查看 : file_put_contents('data_len.txt','data:'.$recv_buffer.PHP_EOL, FILE_APPEND);
        // 將數(shù)據(jù)return到onMessage,就完成了簡(jiǎn)單的自定義協(xié)議了
        return $recv_buffer;

    }

    /**
     * Encode.
     *
     * @param string $buffer
     * @return string
     * 這個(gè)是給客戶(hù)端發(fā)送數(shù)據(jù)的,我沒(méi)用到
     */
    public static function encode($data)
    {

        return $data;
    }

}
workerman程序代碼:
&lt;?php
use Workerman\Worker;
use Workerman\Lib\Timer;
define('BASE_DIR','。。。');
require_once BASE_DIR . 'Workerman/Autoloader.php';
require_once BASE_DIR . 'worker/mysql-master/src/Connection.php';

    $tcp_worker = new Worker(&quot;Lxy://0.0.0.0:8282&quot;);
    $tcp_worker-&gt;onWorkerStart = function ($worker) {
        global $db;
        //地址,端口,賬戶(hù),密碼,數(shù)據(jù)庫(kù)名
        $db = new \Workerman\MySQL\Connection('127.0.0.1', '3306', '', '', '');
    };

    // 啟動(dòng)進(jìn)程對(duì)外提供服務(wù)
    $tcp_worker-&gt;count = 1;
    //獲取客戶(hù)端ip
    $tcp_worker-&gt;onConnect = function ($connection) {
        global $db;
        echo &quot;client connect ip:&quot; . $connection-&gt;getRemoteIp() . &quot; port:&quot; . $connection-&gt;getRemotePort() . PHP_EOL;
        $connection-&gt;send('connection success');
    };
    $tcp_worker-&gt;onMessage = function($connection, $data){
        global $db;
        var_dump($data);
        echo 'sssssssssssssssssssssssssss'.PHP_EOL;
    };

// 運(yùn)行worker
Worker::runAll();
  • 暫無(wú)評(píng)論
年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??