2

サーバー (以下にリストされている Java プログラムをホストするコンピューター) が実行されているかどうかを判断する PHP スクリプトを作成しようとしました。実行されている場合、php 関数は true を返し、そうでない場合は false を返します。

サーバーは次のとおりです。

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 つのエラーは引き続き表示されます。

4

2 に答える 2

1

サーバーの DataOutputStream オブジェクトを閉じないでください。

response.close();サーバーの行にコメントを付けるだけで、プログラムが動作するはずです。

于 2012-04-25T05:32:43.460 に答える
0

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

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

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

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

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

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

于 2012-04-25T05:41:45.030 に答える