2012-04-25 11 views
2

サーバ(以下に示すJavaプログラムをホストするコンピュータ)が動作しているかどうかを判断するPHPスクリプトを作成しようとしました。そうであれば、PHP関数は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を返すようですが、最後の2つのエラーがまだ表示されます。

+0

マシンにJava部分を実行するファイアウォールがありますか?またはjavaの部分がルータの後ろにホストされている場合は、ポート転送設定をしましたか? –

+0

@ VideanuAdrian OK、ポートだけがポート4343を転送し、最初のエラーでは表示されなくなりましたが、関数は常にfalseを返しているように見え、最後の2つのエラーは引き続き表示されます。 – Darestium

+0

ああ、また、サーバーアプリケーションがオフのときにエラー(最初のエラー)が表示され、その関数はまだfalseを返します。 – Darestium

答えて

0

クライアント/サーバーを実行しているときは、アプリケーションを実行しているユーザーがそのポートにアクセスできるかどうかを知る必要があります。 1024へのポートは、システムの知っているアプリケーション/サービスによって予約されています。ポイント1:

ポイント2:最良の方法の1つは、接続スレッドアプローチでサーバーを実行することです。この方法で実行すると、新しいクライアント要求が到着すると、サーバーは要求スレッドを接続スレッドに委任できます。

ポイント3:メッセージはプロトコルに関連しています。 HTTPやFTPなどの組み込みプロトコルを使用している場合は、プロトコルルールを使用する必要があります。そうでない場合は、メッセージ要求/応答の独自のルールを作成できます。

続行する前に、Java Networking Tutorialをお読みになることをお勧めします。すべてのJavaサンプルを実行します。後で、PHPと混合することができます。あなたが持っているソケットとプロトコルに関する情報が多くなればなるほど、あなたのプログラムはより良くなります。

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

が、これはあなたを助けることができる願っています。

1

サーバーのDataOutputStreamオブジェクトを閉じてはいけません。

サーバーのresponse.close();行にコメントするだけで、プログラムは機能します。

+0

+1 –