Socket PHP зависает на fgets

У меня есть серверное и клиентское приложение на JAVA, что работает с этим сервером. На первый взгляд проблем нет — JAVA использует socket.getInputStream() для получения данных и socket.getOutputStream() для отправки данных.

Мне нужно написать такой же клиент на PHP. Все примеры из мануалов мне не помогли. Я могу успешно подключиться к серверу, но когда я пытаюсь что-то прочитать - страница зависает. Например:

$fp = stream_socket_client($addr, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, $data);
    while (!feof($fp)) {
        var_dump(fgets($fp, 1024));
    }
    fclose($fp);
}

Этот код зависает даже без while.

Что может быть не так?


person Vasiliy    schedule 27.04.2011    source источник


Ответы (1)


Ваш сервер действительно отправляет байты?

fgets($fp, 1024)

возвращается, если выполняется одно из следующих условий:

– получен EOF или новая строка

– Прочитано 1024–1 байт

или удаленная сторона закрыла соединение.

Если эти условия не выполняются, вызов блокируется.

Как насчет изменения 1024 на меньшее число или использования fgetc()?

person SteAp    schedule 27.04.2011
comment
В моем случае у меня есть ответ с конечной строкой Windows (т.е. 0xd, за которой следует 0xa -\r\n-), выполняя символ за символом, как упоминает @StepAp, и делая разрыв внутри тела, в то время как при обнаружении 0xa решает проблему. - person Jordi Espada; 29.01.2019