0

だから私は、デスクトップアプリケーション(ネットワークでプレイすることになっているゲーム)でSocketとServerSocketを使用するTCP / IPサーバー/クライアントモデルを持っています。

サーバーのリモート IP アドレスを取得して、クライアント アプリケーションが、開かれた特定のポートで開かれたサーバー アプリケーションに接続できるようにする必要があります。

public class ServerConnection {

private int PORT = 8100;
private ServerSocket serverSocket = null;

public void create() throws IOException {
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress("localhost", PORT));
}

public void close() throws IOException {
    serverSocket.close();
}

public ClientConnection acceptRequest() throws IOException {
    Socket socket = serverSocket.accept();
    return new ClientConnection(socket);
}

public ServerConnection() throws IOException {
}
}
public class ClientConnection {

    private String adress = "127.0.0.1";
    private int PORT = 8100;
    private Socket socket = null;
    private PrintWriter out = null;
    private BufferedReader in = null;

    public ClientConnection() {

    }

    public ClientConnection(Socket socket) throws IOException {
        this.socket = socket;
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
    }

    public void connect() throws UnknownHostException, IOException {
        socket = new Socket(adress, PORT);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
    }


    public void close() throws IOException {
        if (out != null) {
            out.close();
        }
        if (in != null) {
            in.close();
        }
        if (socket != null) {
            socket.close();
            socket = null;
        }
    }

    public void send(String request) {
        if (socket != null) {
            out.println(request);
        }            
    }

    public String receive() throws IOException {
        if (socket != null) {
            return in.readLine();
        }
        return null;
    }
}

ローカルホストでも問題なく動作しますが、どこでも (サーバーとクライアント) 実行できるようにしたいと考えています。したがって、サーバーが現在のリモートIPであることを確認する方法が必要です。ユーザーは通信回線(IM、電子メールなど)を介して送信し、その後クライアントはアドレスを入力してサーバーに接続します。したがって、1 つのアプリケーションがサーバーまたはクライアントの両方として機能できるため、継続的に実行されてクライアントにサービスを提供する安定したサーバー アプリケーションは必要ありません。

4

2 に答える 2

1

クライアントとサーバーが同じネットワークセグメントに存在する場合、Zeroconfは非常に魅力的なゼロ構成(まあ...)ソリューションです。JmDNSを使用したJava実装があります

さらに、安定したプロトコルを最初から実装するのは簡単な作業ではありません。教育目的でない場合は、次のようなものに依存することをお勧めします

  • アパッチミナ
  • グリズリー
  • Netty 3
  • QuickServer
  • xSocket

これらのライブラリは、エラー処理や同時実行性(ノンブロッキング呼び出し)など、ここで重要な多くの機能を提供します。

外部からサーバーにアクセスしたい場合は、「localhost」にバインドできません。ServerSocket.bindを参照してください。「null」にバインドし、ServerSocket.getInetAddressを介してデフォルトで使用されているネットワークアダプターを要求できます。

于 2012-05-10T19:01:28.763 に答える
0

次の 2 つの調整を行う必要があります。

  • サーバーソケットは、localhost 以外のものにバインドする必要があります。通常new ServerSocket(port)、ホスト名を指定せずに を使用してサーバー ソケットを作成します。このように、サーバー ソケットは、指定されたポートで、マシン上で使用可能なすべてのアドレスをリッスンします。ソケットを「localhost」にバインドすると、localhost からのみアクセスできるようになります。それはあなたが望むものではありません。サーバー ソケットを作成した後、 をSocketAddress使用してその確認を試みることができますserverSocket.getLocalSocketAddress()

  • クライアントは、サーバー ソケットの作成/バインド時に指定したアドレスに接続する必要があります。アドレスを指定せずにサーバー ソケットを作成した場合 (つまり、使用可能なすべてのアドレスにバインド)、クライアントはそれらのいずれにも接続できます (通常は localhost + 外部 IP アドレス)。

通常、サーバーは自分のアドレスを知る必要はありません。それらは にバインドするだけ<any address>:portで、クライアントは接続先のアドレスを知っている必要があります。

于 2012-05-10T19:35:42.263 に答える