2012-04-25 90 views
2

我試圖創建一個PHP腳本,它確定服務器(承載下面列出的Java程序的計算機)是否正在運行,如果是,則PHP功能應返回true,否則返回true它返回false。在PHP和Java中使用套接字

這裏是服務器:

package darestium.minecraft.server; 

import java.io.BufferedReader; 
import java.net.*; 
import java.io.*; 

public class Server { 
    private static ServerSocket socket; 

    private static Socket connection; 
    private static String command  = new String(); 
    private static String responseStr = new String();; 

    private static int port = 4343; 

    public static void main(String args[]) { 
     System.out.println("Signal Server is running."); 

     try { 
      socket = new ServerSocket(port); 

      while (true) { 
       connection = socket.accept(); 

       InputStreamReader inputStream = new InputStreamReader(connection.getInputStream()); 
       DataOutputStream response = new DataOutputStream(connection.getOutputStream()); 
       BufferedReader input = new BufferedReader(inputStream); 

       command = input.readLine(); 

       response.writeBytes(responseStr); 
       response.flush(); 
       //response.close(); 

       System.out.println("Running"); 
      } 
     } catch (IOException e) { 
      System.out.println("Fail!: " + e.toString()); 
     } 

     System.out.println("Closing..."); 
    } 
} 

這裏是客戶端:

<? 
    function isRunning() { 
     $address = 'darestium.dyndns-free.com'; 
     $port = 4343; 
     $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); 
     $message = 'loolololol'; 

     try { 
      socket_connect($socket, $address, $port); 

      $status = socket_sendto($socket, $message, strlen($message), MSG_EOF, $address, $port); 

      if ($status != false) { 
       return true; 
      } 

      return false; 
     } catch (Exception $e) { 
      return false; 
     } 
    } 
?> 

以下是顯示了PHP頁面上的回聲出函數的結果的錯誤信息像這樣:

include('server.php'); 
echo isRunning(); 

然後,錯誤消息:

Warning: socket_connect() [function.socket-connect]: unable to connect [0]: No connection could be made because the target machine actively refused it. in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 9 

Notice: Use of undefined constant MSG_EOF - assumed 'MSG_EOF' in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 11 

Warning: socket_sendto() expects parameter 4 to be long, string given in C:\Users\darestium\Documents\Portables\xampp\htdocs\darestium\minecraftserver.php on line 11 

我想知道如何解決這個問題。此外,我希望能夠發送消息到服務器,任何想法我怎麼能做到這一點?我基於此Simple Java TCP Server and PHP Client Problems

注意:我是非常新的套接字和服務器/客戶端通信。

編輯:

@VideanuAdrian OK,只是端口轉發端口4343,它不再顯示了第一個錯誤,但功能似乎總是返回false,最後兩個錯誤仍然顯示。

+0

運行java部分的機器上是否有防火牆?或者如果Java部件位於路由器後面,您是否有端口轉發設置? – 2012-04-25 05:34:03

+0

@VideanuAdrian好的,只是端口轉發端口4343,它不再顯示與第一個錯誤,但該函數似乎總是返回false,最後兩個錯誤仍然顯示。 – Darestium 2012-04-25 05:49:15

+0

哦,另外,錯誤(第一個)在服務器應用程序關閉時再次顯示,並且該函數仍然返回false。 – Darestium 2012-04-25 06:06:33

回答

0

運行客戶端/服務器時,您需要知道運行應用程序的用戶是否有權訪問該端口。由系統知道的應用程序/服務保留到1024的端口。第1點。

第2點:最好的方法之一是在連接線程方法中運行服務器。以這種方式運行時,當新的客戶端請求到達時,服務器可以將請求句柄委託給連接線程。

點3:消息與協議有關。如果您使用的是像HTTP或FTP這樣的內置協議,則必須使用協議規則。如果沒有,您可以爲消息請求/響應構建自己的規則。

我建議您在繼續之前閱讀Java網絡教程。運行所有Java示例。稍後,您可以與PHP混合使用。有關套接字和協議的更多信息,您的程序將會更好。

http://docs.oracle.com/javase/tutorial/networking/

希望這可以幫助你。

1

您不應該關閉服務器中的DataOutputStream對象。

只需在您的服務器中註釋行response.close();並且程序應該可以工作。

+0

+1爲您的答案 – 2012-04-25 05:36:13