php сокеты читают массив json с сервера java - PullRequest
0 голосов
/ 16 мая 2011

Я подключаюсь к серверу, написанному на 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 socket\n");
        $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 host\n");

        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 Ответ

1 голос
/ 16 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...