У меня странная проблема с чтением 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;
}
Итак, проблема в том, что чтение и запись в цикле, поэтому поток идет так
длина (целое число) bufret (строка) длина (целое число) bufret (строка) длина (целое число) bufret (строка)
в скобках я написал тип данных. Все хорошо при первом выполнении цикла во время чтения (потому что запись идет нормально), но когда я читаю во второй раз длину serviceId
из этих 4 байтов я получаю String(1)
, но когда я пропускаю следующие 4 байта, я могу продолжить читать мою строку. Эти «нечитаемые» 4 байта в utf-8 выглядят так:
[NULL][NULL][NULL][SO]
Я действительно сошел с ума, потому что понятия не имею, что не так и что я должен делать.
Спасибо за помощь.
С уважением.
Задача ещё не решена.
Других решений пока нет …