异步套接字客户端缓冲区大小
我必须使用异步套接字连接来连接远程服务器并检索数据。 我可以连接但有问题。
包裹是按件发送的。 我有两个选择; 我可以设置一个缓冲区,并在完成所有传输时将整个包装整件或合并为一件。 我认为第一个选项(缓冲区事件)是正确的方法。
我正在定义一个缓冲区大小,但它不适用于第一部分。 在其他部分,它的工作原理,但用这种方法,我不能整件包装在一块,因为第一部分限制在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。
你必须做三件事:
$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?