sendtoclient 客户端是 php fread 数据 不全

pmes

客户端php 截选如下

$r='';
do { 
    $r.=fread($fp, 1024);
    $s=stream_get_meta_data($fp);
} while ($s);

接收有时候不足 8192 有时到了8192 没了,大家有遇到这个问题吗?

2557 1 0
1个回答

walkor

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;
    }
}
  • 暂无评论
年代过于久远,无法发表回答
🔝