2010-11-12 45 views
2

我試圖在PHP頁面和運行Java服務器之間進行通信。 只需通過套接字進行簡單的字符串交換。PHP Socket 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訪問此網頁,因此它將結果「回聲」回到其他頁面。

回答

1

我個人更喜歡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

嘗試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

現在阻塞消失了,但我仍然沒有得到任何與fgets()。 – Hippopotamus 2010-11-12 16:28:54

+0

似乎服務器期待換行符終止的字符串。你試過'fputs($ fp,$ str。「\ n」);'? – stillstanding 2010-11-12 16:33:08

+0

Java服務器獲取$ str,因爲我現在擁有它,沒有「\ n」 – Hippopotamus 2010-11-12 16:43:35

0

我的朋友給我發了這個鏈接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; 
} 
+1

這不是一個「竅門」。 'BufferedReader中。readLine()'讀取,直到它看到一個回車或換行字符,這是'chr(13)'和'chr(10)'分別是什麼。請參閱:http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine() – SimonJ 2010-11-13 00:38:11

+0

「竅門」我的意思是我錯過的小細節。 – Hippopotamus 2010-11-13 10:36:47