异步套接字客户端缓冲区大小

我必须使用异步套接字连接来连接远程服务器并检索数据。 我可以连接但有问题。

包裹是按件发送的。 我有两个选择; 我可以设置一个缓冲区,并在完成所有传输时将整个包装整件或合并为一件。 我认为第一个选项(缓冲区事件)是正确的方法。

我正在定义一个缓冲区大小,但它不适用于第一部分。 在其他部分,它的工作原理,但用这种方法,我不能整件包装在一块,因为第一部分限制在5,24 Kb。

你可以在下面找到我的代码:

$loop = ReactEventLoopFactory::create();

        $dnsResolverFactory = new ReactDnsResolverFactory();
        $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
        $connector = new ReactSocketClientConnector($loop, $dns);
        $connector->create( ENDPOINT_IP , ENDPOINT_PORT )->then(function (ReactStreamStream $stream) use ($loop) {

            $command = '{C:"EL",bmId:43,inst:"my_instance",tok:"my_token"}';

            $command_length = strlen($command);
            $command_length = pack("N", $command_length);

            $stream->write($command_length);
            $stream->write($command);

            $stream->bufferSize = 999999;
            $stream->on('data', function ($data) {

            $package    =   substr($data, 0, 4);
            $unpack     =   unpack('N', $package); // I'm getting whole package size

            echo $data;



            });


        });

        $loop->run();

我试图在$stream->on('data', function ($data) { line $stream->on('data', function ($data) {下定义一个缓冲区大小$stream->on('data', function ($data) {但是你猜它失败了,我不知道如何正确处理它。

提前致谢。


“我可以设置一个缓冲区,并在完成所有传输时将整个软件包整合到一起,或者合并为一个片段,我认为第一个选项(缓冲区事件)是正确的。”

第一种选择不是正确的方法,因为它不是套接字通信的工作方式。

例如,如果您正在接收5 kB数据并将缓冲区设置得足够大,比如说10 kB,则不能期望在一次调用$stream->on('data', function ($data) { ...您将收到全部5 kB。

必须做三件事:

  • 您需要知道您在一个消息块中接收的数据的确切大小。 要么你知道消息总是有固定的和已知的大小,或者数据块有一个头部,从中可以读取消息的长度。 在你的情况下,你正从接收数据的前4个字节读取消息大小。
  • 在循环中,您需要读取来自服务器的数据块并将它们连接起来,直到您有足够的字节来读取整个消息的大小。 在你的情况下,这是4个字节。 然而,听起来很奇怪,有两种方法可以在两个块中分别接收1和3个字节,两次调用$stream->on('data', function ($data) { ...当连接的大小数据是>=4那么你读取消息的大小。
  • 在同一个循环中,您需要继续读取来自套接字的数据块并将它们连接起来,直到您收到所有消息字节。 当然,这意味着你需要在循环之外定义一个变量来存储接收到的数据。 收到完整消息后,您需要退出循环。
  • 好主意是你为循环设置了一个计时器,这样你就可以等待整个消息在有限的时间内被接收。 可能发生客户端和服务器之间的连接在传输期间中断,并且如果您没有超时逻辑,则您的循环将永久等待接收整个消息。

    链接地址: http://www.djcxy.com/p/91289.html

    上一篇: Asynchronous Socket Client Buffer Size

    下一篇: How to make IdentityServer to add user identity to the access token?