Reactphp无法获取流中的全部数据
问题描述:
即时通讯使用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();
答
看来您在收到数据后立即关闭连接......您应该保持此连接处于打开状态,直到您收到所有数据。数据事件在接收到一些数据后调度,而不是所有的数据。
通常这是实现特定的,如果你处理RPC风格的API,发送请求的客户端可能不关心来自服务的确认并在发送数据后切断连接;在这种情况下,您应该在数据事件上累积缓冲区,然后在结束事件中处理它。
如果要保持连接处于打开状态并发送离散的信息块,通常要么将数据包引导至包的大小,让您知道在处理之前需要填充多少缓冲区,否则可以发送标记包的结尾的分隔符(通常是空字节)。
我用计时器改变了解决方案,但一些软件包的响应时间很长,所以我正在检查im reciving软件包的大小,并将其与我应该收回的大小进行比较。谢谢 –