Я пытаюсь установить связь между страницей PHP и запуском Java-сервера. Просто простая замена строк через сокеты.
Это мой код Java для потока, который обрабатывает соединение:
InputStream in = clientSocket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); String request; if((request=br.readLine())!=null){ System.out.println("got the following request: " + request); out.write(request +"\n"); out.flush(); out.close(); in.close(); }
Я протестировал его с помощью простого Java-клиента, который отправляет строку, затем получает результат и распечатывает его, и он работал. И клиент, и сервер имели одинаковый результат.
Это мой PHP-код:
$fp = @fsockopen ($host, $port, $errno, $errstr); if($fp){ fputs($fp, $str); //echo fgets($fp); } close($fp);
Который отправляет строку на Сервер, и Сервер ее получает. Но как только я раскомментирую строку с fgets ($ fp), я заблокирован до тех пор, пока через 1-2 минуты не произойдет какой-то тайм-аут. Во время этого Блока мой сервер ничего не получает. После того, как мой сервер печатает, что он получил строку и, вероятно, отправляет ответ, однако, код PHP ничего не печатает.
В чем может быть проблема?
Заранее спасибо.
PS Возможно, стоит сказать, что я обращаюсь к этой веб-странице через AJAX, поэтому она «отгоняет» результат обратно на другую страницу.
Я предпочитаю функции socket_*
лично. Но в любом случае вам, вероятно, не хватает проверки для завершающего символа:
$sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_connect($sock, $host, $port); socket_write($sock, $str); $response = ''; while($resp = socket_read($sock, 1024)) { if(!$resp) break; $response .= $resp; if(strpos($resp, "\n") !== false) break; } echo "Server said: {$response}";
Попробуйте добавить после fsockopen()
:
stream_set_blocking($fp,0); $info=stream_get_meta_data($fp); if ($fp) { fputs($fp,$str); $reply=''. while (!feof($fp) && !$info['timed_out']) { $reply.=fgets($fp); echo $reply; } close($fp);
оstream_set_blocking($fp,0); $info=stream_get_meta_data($fp); if ($fp) { fputs($fp,$str); $reply=''. while (!feof($fp) && !$info['timed_out']) { $reply.=fgets($fp); echo $reply; } close($fp);
Мой друг отправил мне эту ссылку http://abejali.com/?p=56 с очень приятным кодом, который делает трюк. Внутри есть трюк, который решает проблему
Следующий код работает. Хитрость заключалась в том, чтобы добавить chr (13). chr (10) до конца строки.
$str.= chr(13) . chr(10); stream_set_blocking($fp,0); $info=stream_get_meta_data($fp); if ($fp) { fputs($fp,$str); $reply=''; while (!feof($fp) && !$info['timed_out']) { $reply.= fread($fp, 1); } echo $reply; }
о$str.= chr(13) . chr(10); stream_set_blocking($fp,0); $info=stream_get_meta_data($fp); if ($fp) { fputs($fp,$str); $reply=''; while (!feof($fp) && !$info['timed_out']) { $reply.= fread($fp, 1); } echo $reply; }