呼叫大神walkor,Gateway的客户端接收数据,8192字节不够的问题

angelhome

小弟超级菜鸟,最近有个项目,准备用Gateway做数据服务端,就找了个例子来做参考,events.php的onmessage处理业务,然后返回了一个数量较大的字符串集,客户端用fread()来读取,但是8192字节好像不够用,造成了显示的数据不全,请问walkor我应该如何处理,多谢了。
代码截取如下:
服务端onmessage:
返回一个拼成的网页,数据有时较大。

foreach($sumtable as $link)
{
    //echo $link."_".$link."_".$link."*".$link."\n";
    $html .="<tr ";
    if( $i%2 == 1)
    {
        $html .="bgcolor=\"#CCCCCC \"";
    }
    $html .="onClick=\"test('".$link."','".$link."','".$starttime."','".$endtime."')\">";
    //$html .="<td width=25%>".$link."</td>";
    $html .="<td width=25%>".$link."</td>";
    $html .="<td width=25%>".number_format($link,2)."</td>";
    $html .="<td width=25%>".number_format($link,2)."</td>";
    $html .="<td width=25%></td>";
    $html .="</tr>";
    $i++;
}
//echo $html;
Gateway::sendToCurrentClient($html);
return;

客户端读取:

$link=stream_socket_client('tcp://192.168.2.161:8282');
if(!$link) { echo "连接失败";}
else {
    //发送店铺品类销售
    //$stime=time();
    $data_array=array('type'=>'depsaletype','starttime'=>$starttime,'endtime'=>$endtime);
    $data=json_encode($data_array);
    fwrite($link,$data);
    echo $receive=fread($link,8129);
}

因为参考的一个例子,所以用fwrite来发送数据,用fread读取,这里的fread($link,8192),8192字节好像不够用,但是不知道该怎么处理。希望walkor能给我点意见,本人php菜鸟,多谢赐教。

4119 1 0
1个回答

walkor

tcp本来就是流式的,数据一点一点流入对方。收到的数据不全是正常的,说明还需要继续调用fread读取,直到读取到全部数据。

基于tcp传输需要定一个通讯协议来组包,具体看workerman手册通讯协议部分。
原理是每个消息里面都带上消息长度的标记,例如用某个特殊字符作为消息结束符,fread返回的数据里没有结束符,那么认为消息还有数据没收完,继续调用fread读取,直到读到结束符。

  • angelhome 2017-11-20

    受教了,感谢walkor的回答,我再认真读下手册,不行的话再用别的协议试试。多谢了

年代过于久远,无法发表回答
🔝