сокеты php считывают массив json с сервера Java

#java #php #sockets #php-socket

#java #php #сокеты #php-socket

Вопрос:

Я подключаюсь к серверу, написанному на JAVA, используя TCP / IP. Мое приложение отправляет массивы json на этот сервер и в некоторых случаях также ожидает некоторых результатов, массивов json. Проблема в том, что я могу легко отправить json через tcp, но при его чтении скрипт зависает, ожидая вечно, пока не истечет время ожидания. Вот мой код.

 $sock = socket_create(AF_INET, SOCK_STREAM, 0)  //Creating a TCP socket
                or die("error: could not create socketn");
        $succ = socket_connect($sock, Application_Model_Config::serverHost, Application_Model_Config::serverPort)   //Connecting to to server using that socket
                or die("error: could not connect to hostn");

        socket_write($sock, $send.'n', strlen($send) 1);

        $response = '';
        while ($resp = socket_read($sock, 1024)) {
            if (!$resp)
                break;
            $response .= $resp;
            if (strpos($resp, "n") !== false)
                break;
        }

        echo "Server said: {$response}";
    }
  

$send — это массив, закодированный как json_encode ($array).

Отправка в порядке, но когда необходимо получить, я ничего не получаю.

Я бы не возражал справиться с этим с помощью jquery (отправка и получение объектов json с сервера), если это было бы возможно. Я не знаю ни о какой реализации, которая достигает чего-то подобного, но я открыт для предложений…на самом деле предпочел бы это вместо php.

Ответ №1:

В режиме, который вы используете socket_read , он имеет ту же семантику, что и recv :

Если в сокете нет доступных сообщений, вызовы receive ожидают поступления сообщения, если только сокет не является неблокирующим (см. fcntl(2) ), в этом случае возвращается значение -1 и внешней переменной errno присваивается значение EAGAIN . Вызовы receive обычно возвращают любые доступные данные, вплоть до запрошенной суммы, вместо ожидания получения полной запрошенной суммы.

Следовательно, если скрипт «вечно ждет, пока не истечет время ожидания», это потому, что нет данных для чтения. Вы можете подтвердить это с помощью анализатора пакетов.