使用fread()

时间:2016-06-06 11:26:42

标签: java php byte 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是string。

在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;
    }

所以,问题是,读取和写入是循环的,所以流就像这样     长度(整数)bufret(字符串)长度(整数)bufret(字符串)长度(整数)bufret(字符串)

在括号中我写了一种数据。在读取时首次执行循环时一切都很好(因为写入正常)但是当我从这4个字节读取serviceId的第二次长度时,我得到String(1),但是当我跳过下一个4个字节,我可以继续读取我的字符串。这些&#34;难以理解&#34; utf-8中的4个字节如下所示:

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

我实际上已经忘记了,因为我不知道出了什么问题,以及我应该做些什么。

感谢您的帮助。 问候。

1 个答案:

答案 0 :(得分:0)

它可以帮助您将数据转换为所需的类型。 在我的特定情况下,我使用了Web套接字。也许这样的实现可以解决您的问题。我一直听数据,直到获得特定的数据类型。 重要的是要注意我正在期待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));