я использую 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();
Похоже, что вы закрываете соединение сразу после получения данных … Вы должны держать это соединение открытым до тех пор, пока не получите все данные. Событие данных отправляется после получения некоторых данных, а не всех данных.
Обычно это зависит от реализации, если вы имеете дело с API в стиле RPC, клиент, отправляющий запрос, может не заботиться о подтверждении от службы и прерывать соединение после отправки данных; в этом случае вы должны накапливать свой буфер для события данных, а затем обрабатывать его в конце события.
Если вы хотите, чтобы соединение оставалось открытым, и отправлять дискретные порции информации, обычно вы либо приводите пакет данных с размером пакета, позволяя вам узнать, сколько буфера нужно заполнить перед обработкой, либо вы можете отправить разделитель (обычно нулевой байт), обозначающий конец пакета.
Других решений пока нет …