Я подключаюсь к серверу, написанному в 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.
В режиме, в котором вы используете socket_read
, он имеет ту же семантику, что и recv
:
Если в сокете нет сообщений, вызовы приема ждут сообщения, если сокет не блокируется (см.
fcntl(2)
), и в этом случае возвращается значение -1, а внешняя переменнаяerrno
устанавливается вEAGAIN
. Приобретенные вызовы обычно возвращают любые доступные данные, вплоть до запрашиваемой суммы, вместо ожидания получения полной запрашиваемой суммы.
Поэтому, если сценарий «ждет навсегда до тех пор, пока не истечет время ожидания», это связано с тем, что нет данных для чтения. Вы можете подтвердить это с помощью сниффера пакетов.