2 Stimmen

PHP Socket Java Nachrichtenaustausch

Ich versuche, eine Kommunikation zwischen einer PHP-Seite und einem laufenden Java-Server herzustellen. Nur ein einfacher String-Austausch über Sockets.

Dies ist mein Java-Code für den Thread, der die Verbindung verarbeitet:

            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();
                }

Ich habe es mit einem einfachen Java-Client getestet, der die Zeichenkette sendet, dann das Ergebnis empfängt und es zurückdruckt, und es hat funktioniert. Sowohl der Client als auch der Server hatten die gleiche Ausgabe.

Dies ist mein PHP-Code:

$fp = @fsockopen ($host, $port, $errno, $errstr);

if($fp){
    fputs($fp, $str);
    //echo fgets($fp);
}

close($fp);

Dieser sendet die Zeichenfolge an den Server, und der Server empfängt sie. Aber sobald ich die Zeile mit fgets($fp) auskommentiere, werde ich blockiert, bis nach 1-2 Minuten eine Art Timeout eintritt. Während dieses Blocks empfängt mein Server nichts. Nach der Zeitüberschreitung gibt mein Server aus, dass er die Zeile empfangen hat, und sendet wahrscheinlich die Antwort zurück, aber der PHP-Code gibt nichts aus.

Was könnte das Problem sein?

Ich danke Ihnen im Voraus.

P.S. Es ist wahrscheinlich erwähnenswert, dass ich auf diese Webseite über AJAX zugreife, so dass das Ergebnis auf die andere Seite "zurückgesendet" wird.

1voto

bcosca Punkte 17013

Versuchen Sie, nach 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);

1voto

mway Punkte 4286

Ich bevorzuge die socket_* Funktionen, persönlich. Aber so oder so, Sie sind wahrscheinlich fehlt Überprüfung für ein Abschlusszeichen:

$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}";

0voto

Dmitry Punkte 156

Mein Freund hat mir diesen Link geschickt http://abejali.com/?p=56 mit einem sehr schönen Code, der den Zweck erfüllt. Es gibt einen Trick darin, der das Problem löst

Der folgende Code funktioniert. Der Trick bestand darin, chr(13) . chr(10) an das Ende der Zeichenkette anzuhängen.

$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;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X