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

小弟超级菜鸟,最近有个项目,准备用Gateway做数据服务端,就找了个例子来做参考,events.php的onmessage处理业务,然后返回了一个数量较大的字符串集,客户端用fread()来读取,但是8192字节好像不够用,造成了显示的数据不全,请问walkor我应该如何处理,多谢了。
代码截取如下:
服务端onmessage:
返回一个拼成的网页,数据有时较大。
foreach($sumtable as $link)
{
//echo $link['typeid']."".$link['typename']."".$link['num']."*".$link['amount']."\n";
$html .="<tr ";
if( $i%2 == 1)
{
$html .="bgcolor=\"#CCCCCC \"";
}
$html .="onClick=\"test('".$link['typeid']."','".$link['typename']."','".$starttime."','".$endtime."')\">";
//$html .="<td width=25%>".$link['typeid']."</td>";
$html .="<td width=25%>".$link['typename']."</td>";
$html .="<td width=25%>".number_format($link['num'],2)."</td>";
$html .="<td width=25%>".number_format($link['amount'],2)."</td>";
$html .="<td width=25%></td>";
$html .="</tr>";
$i++;
}
//echo $html;
Gateway::sendToCurrentClient($html);
return;
客户端读取:
<?php
$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菜鸟,多谢赐教。
已邀请:

walkor

赞同来自: angelhome

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

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

要回复问题请先登录注册