客户端php 截选如下
$r=''; do { $r.=fread($fp, 1024); $s=stream_get_meta_data($fp); } while ($s);
接收有时候不足 8192 有时到了8192 没了,大家有遇到这个问题吗?
tcp是流式的,数据是分批发过来的,发过来的数据会暂存在系统socket缓冲区,$s只是代表缓冲区是否有未读数据,不代表整个数据包是否传递完毕。所以你上面的代码是有问题的。 稳妥的方法是根据通讯协议来分包,例如数据发过来的前几个字节是数据包的长度len,得到长度后while循环直到读取len长度的数据后跳出while循环,这样才是完整的数据。
类似
$len = 0; $buf = ''; while(1) { $buf .= fread($fp, 1024); // 还不知道数据长度,计算这个包的数据长度 if (!$len) { // your_func_of_get_len里还要判断下目前收到的数据长度是否足够计算出整个包的长度 $len = your_func_of_get_len($buf); } // 判断数据是否全部得到,得到就跳出 if (strlen($buf) >= $len) { // 实际上最好要截取下,因为tcp流式的,可能是多个包粘在一起。如果是多个包粘在一起,还要记得保存下个包的部分数据,避免数据丢失,这里省略了 $buf = substr($buf, 0, $len); break; } }
tcp是流式的,数据是分批发过来的,发过来的数据会暂存在系统socket缓冲区,$s只是代表缓冲区是否有未读数据,不代表整个数据包是否传递完毕。所以你上面的代码是有问题的。
稳妥的方法是根据通讯协议来分包,例如数据发过来的前几个字节是数据包的长度len,得到长度后while循环直到读取len长度的数据后跳出while循环,这样才是完整的数据。
类似