使用fread()按字节读取stream_socket_client



我在按字节读取stream_socket_client时遇到了一个奇怪的问题,我从JAVA发送响应,看起来像这样:

this.writeInt(output,target.getServiceId().getBytes().length);                    
output.write(target.getServiceId().getBytes();                    
this.writeInt(output, bufret.length);
output.write(bufret);

target.getServiceId()返回一个整数,bufret是字符串。

在PHP中,我通过fread()函数读取它。

它看起来像这样:

$length = fread ($this->client, 4);     
$length = $this->getInt($length);
$serviceId = fread ($this->client, $length);
$length = fread ($this->client, 4);             
$length= $this->getInt($length);
$bufret = $this->getBufret($length);    

我把4个字节读入长度,因为它是整数,所以是4个字节。我将字节解析为int的函数如下所示:

function getInt($length){
$dlugosc = unpack("C*", $length);
return ($length[1]<<24) + ($length[2]<<16) + ($length[3]<<8) + $length[4];
}

我认为在这种情况下,getBufret()函数如何工作并不重要,但我也可以展示

function getTresc($length){
$count = 0;
$bufret="";
if($length>8192){
$end = $length%8192;
while($count <= $length){
$bufret.= fread($this->client, 8192);       
$count += 8192;
}
} else {
$end = $length;
}
if($end >0){
$bufret.= fread($this->client, $end);
}
return $bufret;
}

所以,问题是,阅读和写作是循环的,所以流是这样的长度

在括号里,我写了一种类型的数据。在读取时第一次执行循环时一切都很好(因为写入正常),但当我从这4个字节中读取serviceId的第二个时间长度时,我会得到String(1),但当跳过接下来的4个字节时,我可以继续读取字符串。utf-8中这些"不可读"的4个字节看起来像这样:

[NULL][NULL][NULL][SO]

我真的失去了理智,因为我不知道哪里出了问题,也不知道该怎么做

谢谢你的帮助。当做

它可以帮助您将数据强制转换为所需的类型。在我的特殊情况下,我使用的是网络套接字。也许这样的实现将解决您的问题。我一直在听数据,直到得到一个特定的数据类型。需要注意的是,我所期望的是json。

$response = '';
$i = 0;
do {
$http_chunk = fread($backend_socket_connect, 8192);
$response .= $http_chunk;
if($i === 0){
$response = substr($response, strpos($response, '{'));
}
$i++;
$result = json_decode($response,true); 
} while(!is_array($result));

相关内容

  • 没有找到相关文章

最新更新