Reactphp не может получить все данные в потоке

я использую reactphp библиотека, и я работаю с устройством, которое отправляет пакеты разных размеров. Моя проблема, когда я получаю данные

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

Я получаю только часть первого пакета. Есть ли способ ждать, пока устройство отправит все данные?

Здесь, на захват проволочной акулы последний пакет — это тот, который я не могу получить от реакции.

    $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();

1

Решение

Похоже, что вы закрываете соединение сразу после получения данных … Вы должны держать это соединение открытым до тех пор, пока не получите все данные. Событие данных отправляется после получения некоторых данных, а не всех данных.

Обычно это зависит от реализации, если вы имеете дело с API в стиле RPC, клиент, отправляющий запрос, может не заботиться о подтверждении от службы и прерывать соединение после отправки данных; в этом случае вы должны накапливать свой буфер для события данных, а затем обрабатывать его в конце события.

Если вы хотите, чтобы соединение оставалось открытым, и отправлять дискретные порции информации, обычно вы либо приводите пакет данных с размером пакета, позволяя вам узнать, сколько буфера нужно заполнить перед обработкой, либо вы можете отправить разделитель (обычно нулевой байт), обозначающий конец пакета.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]