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

websocket向指定客戶端發(fā)送大文件

a810291783

客戶端每次只能接收744 KB (761,856 字節(jié))后就自動(dòng)斷開(kāi)了

以下是在論壇看到的大文件發(fā)送例子

<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';

$worker = new Worker('http://0.0.0.0:4236');
$worker->onMessage = function($connection, $data)
{
    if($_SERVER == '/favicon.ico')
    {
        return $connection->send("HTTP/1.0 404 Not Found\r\nContent-Length: 0\r\n\r\n", true);
    }
    // 這里發(fā)送的是一個(gè)大的pdf文件,如果是其它格式的文件,請(qǐng)修改下面代碼中http頭
    send_file($connection, "/your/path/xxx.pdf");
};

function send_file($connection, $file_name)
{
    if(!is_file($file_name))
    {
        $connection->send("HTTP/1.0 404 File Not Found\r\nContent-Length: 18\r\n\r\n404 File Not Found", true);
        return;
    }

    // ======發(fā)送http頭======
    $file_size = filesize($file_name);
    $header = "HTTP/1.1 200 OK\r\n";
    // 這里寫(xiě)的Content-Type是pdf,如果不是pdf文件請(qǐng)修改Content-Type的值
    // mime對(duì)應(yīng)關(guān)系參見(jiàn) https://github.com/walkor/Workerman/blob/master/Protocols/Http/mime.types#L30
    $header .= "Content-Type: application/pdf\r\n";
    $header .= "Connection: keep-alive\r\n";
    $header .= "Content-Length: $file_size\r\n\r\n";
    $connection->send($header, true);

    // ======分段發(fā)送文件內(nèi)容=======
    $connection->fileHandler = fopen($file_name, 'r');
    $do_write = function()use($connection)
    {
        // 對(duì)應(yīng)客戶端的連接發(fā)送緩沖區(qū)未滿時(shí)
        while(empty($connection->bufferFull))
        {
            // 從磁盤(pán)讀取文件
            $buffer = fread($connection->fileHandler, 8192);
            // 讀不到數(shù)據(jù)說(shuō)明文件讀到末尾了
            if($buffer === '' || $buffer === false)
            {
                return;
            }
            $connection->send($buffer, true);
        }
    };
    // 發(fā)生連接發(fā)送緩沖區(qū)滿事件時(shí)設(shè)置一個(gè)標(biāo)記bufferFull
    $connection->onBufferFull = function($connection)
    {
        // 賦值一個(gè)bufferFull臨時(shí)變量給鏈接對(duì)象,標(biāo)記發(fā)送緩沖區(qū)滿,暫停do_write發(fā)送
        $connection->bufferFull = true;
    };
    // 當(dāng)發(fā)送緩沖區(qū)數(shù)據(jù)發(fā)送完畢時(shí)觸發(fā)
    $connection->onBufferDrain = function($connection)use($do_write)
    {
        $connection->bufferFull = false;
        $do_write();
    };
    // 執(zhí)行發(fā)送
    $do_write();
}
Worker::runAll();

請(qǐng)問(wèn)是不是Nginx配置原因?qū)е碌?br />

1687 1 0
1個(gè)回答

six

你4236是http協(xié)議啊,都不是websocket協(xié)議。發(fā)的數(shù)據(jù)也是http數(shù)據(jù)

  • a810291783 2024-03-25

    那個(gè)是例子里的,是websocket。protected $socket = 'websocket://0.0.0.0:2345';

  • six 2024-03-25

    發(fā)送大文件直接 send(file_get_contents(文件路徑)) 就好了

  • a810291783 2024-03-25

    這樣發(fā)送給客戶端后直接就斷開(kāi)了,客戶端接收的文件為空。上邊的寫(xiě)法還能接收一部分。不知道到底什么原因,可以給個(gè)大概的猜測(cè)嗎

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