PHP Socket Java обмен сообщениями - PullRequest
2 голосов
/ 12 ноября 2010

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

В чем может быть проблема?

Заранее спасибо.

P.S. Вероятно, стоит сказать, что я захожу на эту веб-страницу через AJAX, поэтому она «повторяет» результат на другой странице.

Ответы [ 3 ]

1 голос
/ 13 ноября 2010

Лично я предпочитаю функции 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}";
1 голос
/ 12 ноября 2010

Попробуйте добавить после 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);
0 голосов
/ 13 ноября 2010

Мой друг прислал мне эту ссылку 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...