2012-03-15 139 views
4

我試圖在充當TCP服務器的Java應用程序和充當客戶端的PHP腳本之間的單個端口上建立簡單的TCP連接。簡單的Java TCP服務器和PHP客戶端問題

我會發佈下面每個代碼,但問題是: 我可以連接併發送數據到Java服務器就好了。我可以得到這些數據並打印出來。我的問題出現在嘗試將響應發送回php服務器。

當我註釋掉php的最後一行「echo socket_read($ socket,14,PHP_NORMAL_READ);」數據到達Java服務器就好了。當我重新添加該行時,數據甚至不會到達Java服務器。

因此,我假設我的問題與我如何從Java發送數據或嘗試從服務器獲取PHP中的數據有關。

這讓我非常難過,任何幫助將不勝感激!

Java服務器:

protected ServerSocket socket; 
protected final int port = 9005; 
protected Socket connection; 
protected String command = new String(); 
protected String responseString = new String(); 


socket = new ServerSocket(port); 


while(true) 
{ 
    // open socket 
    connection = socket.accept(); 
    // get input reader 
    InputStreamReader inputStream = new InputStreamReader(connection.getInputStream()); 
    BufferedReader input = new BufferedReader(inputStream); 
    // get output handler 
    DataOutputStream response = new DataOutputStream(connection.getOutputStream()); 

    // get input 
    command = input.readLine(); 

    // process input 
    Logger.log("Command: " + command); 
    responseString = command + " MC2 It Works!"; 

    // send response 
    response.writeBytes(responseString); 
    response.flush(); 
    response.close(); 
} 

PHP客戶:

$address = 'example.com'; // obviously not the address I am using 
$port = 9005; 
$message = "Test"; 

$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); 

socket_connect($socket, $address, $port) 

if(socket_send($socket, $message, strlen($message), MSG_EOF) != FALSE) 
{ 
    echo socket_read($socket, 14, PHP_NORMAL_READ); 
} 
+1

responseString =命令+ + 「\ r \ n」, 「MC2它的作品!」 – clevertension 2012-03-15 06:22:03

+0

我認爲你必須添加插槽知道你完成發送你的數據的線路的EOF – clevertension 2012-03-15 06:22:42

+0

是的,這絕對是問題的一部分。提交問題後約20分鐘,我想到了這一切。生活也是如此。 – KayoticSully 2012-03-15 06:41:39

回答

1

解決:這是我想通了什麼問題解決方案。當從Java服務器讀回數據時,我只讀了一個塊,其餘的都掛着。數據需要在循環中讀取以獲取所有數據。

另外我發送給Java服務器的數據沒有以新行或回車結束。

下重新編寫PHP客戶端現在使整個事情的工作很好地

$address = 'minecraft.kayoticgamer.com'; 
$port = 9005; 

$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); 
socket_connect($socket, $address, $port); 

$message .= chr(10); 

$status = socket_sendto($socket, $message, strlen($message), MSG_EOF, $address, $port); 
if($status !== FALSE) 
{ 
    $message = ''; 
    $next = ''; 
    while ($next = socket_read($socket, 4096)) 
    { 
     $message .= $next; 
    } 

    echo $message; 
} 
else 
{ 
    echo "Failed"; 
} 

socket_close($socket); 
+0

Hello KayoticSully:我嘗試運行你的例子,但它連續加載顯示在瀏覽器中,請幫助我,如果你已經完成。 – 2015-03-30 09:20:49