Чтение stream_socket_client байтами с использованием fread()

У меня странная проблема с чтением 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;
    }

Итак, проблема в том, что чтение и запись находятся в цикле, поэтому поток идет следующим образом: длина (целое число) длина буфера (строка) длина (целое число) длина буфера (строка) длина (целое число) значение буфера (строка)

в скобках я написал тип данных. Все хорошо при первом выполнении цикла во время чтения (потому что запись идет нормально), но когда я читаю во второй раз длину serviceId из этих 4 байтов я получаю String(1), но когда я пропускаю следующие 4 байта, я могу продолжить читать мою строку. Эти "нечитаемые" 4 байта в utf-8 выглядят так:

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

Я действительно сошел с ума, потому что понятия не имею, что не так, и что я должен делать.

Спасибо за помощь. С уважением.

0 ответов

Это может помочь вам привести данные к ожидаемому типу. В моем конкретном случае я работал с веб-сокетами. Возможно, такая реализация решит вашу проблему. Я слушал данные, пока не получил конкретный тип данных. Важно отметить, что я ожидал 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));
Другие вопросы по тегам