2015-10-07 57 views
1

即時通訊使用reactphp庫,並且正在使用發送不同大小包的設備。我的問題是當我得到的數據Reactphp無法獲取流中的全部數據

$stream->on('data', function ($data, React\Stream\ReadableStreamInterface $stream) { 
      $this->respuesta .= $data; 
      $stream->close(); 
     }); 

我只得到第一個包的一部分。有沒有辦法一直等到設備發送所有數據?

在這裏,wireshark capture最後一個包是我無法得到的反應。

$loop = React\EventLoop\Factory::create(); 

    $dnsResolverFactory = new React\Dns\Resolver\Factory(); 
    $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop); 

    $connector = new React\SocketClient\Connector($loop, $dns); 

    $connector->create($this->host, $this->port)->then(function (React\Stream\Stream $stream) use ($hex) { 
     $stream->write($hex); 
     $stream->on('data', function ($data, React\Stream\ReadableStreamInterface $stream) { 
      $this->respuesta .= $data; 
      $stream->close(); 
     }); 
    }); 

    $loop->run(); 

回答

0

看來您在收到數據後立即關閉連接......您應該保持此連接處於打開狀態,直到您收到所有數據。數據事件在接收到一些數據後調度,而不是所有的數據。

通常這是實現特定的,如果你處理RPC風格的API,發送請求的客戶端可能不關心來自服務的確認並在發送數據後切斷連接;在這種情況下,您應該在數據事件上累積緩衝區,然後在結束事件中處理它。

如果要保持連接處於打開狀態併發送離散的信息塊,通常要麼將數據包引導至包的大小,讓您知道在處理之前需要填充多少緩衝區,否則可以發送標記包的結尾的分隔符(通常是空字節)。

+0

我用計時器改變了解決方案,但一些軟件包的響應時間很長,所以我正在檢查im reciving軟件包的大小,並將其與我應該收回的大小進行比較。謝謝 –