Обмен сообщениями Java Socket Java

Я пытаюсь установить связь между страницей 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; }