1

我正在使用reactphp库,并且正在使用发送不同大小的包的设备。我的问题是当我得到数据时

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

我只得到第一个包裹的一部分。有没有办法一直等到设备发送所有数据?

在这里,在wireshark 上捕获最后一个包是我无法通过react 得到的包。

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

1 回答 1

1

您似乎在收到数据后立即关闭连接...您应该保持此连接打开,直到收到所有数据。data 事件在接收到一些数据后被调度,而不是所有数据。

通常这是特定于实现的,如果您处理 RPC 样式的 api,发送请求的客户端可能不关心服务的确认并在发送数据后切断连接;在这种情况下,您应该在数据事件上累积缓冲区,然后在结束事件上处理它。

如果您想保持连接打开并发送离散的信息块,通常您可以使用数据包的大小引导数据包,让您知道在处理之前要填充多少缓冲区,或者您可以发送分隔符(通常是一个空字节)标记包的结束。

于 2015-10-08T13:41:04.277 回答