1

私はネットワーク上のJavaソケットに関する多くの例を読みましたが、これらすべてにクライアント用のこのコードの同じ行があります。

sock = new Socket("localhost", PORT);

したがって、同じコンピューターでサーバーとクライアントをテストできます。LANまたはアドホックで、クライアントがサーバーの名前を知る方法がない場合。(ハードコードを除いて、サーバーの名前をクライアントコードに直接入力しますが、これは非常に効果的ではありません。たとえば、LANゲームを作成する場合、ゲームを実行する前にサーバーの名前を知ることはできません)

私はこの解決策について持っています:サーバーが作成されると、サーバーはそれらに接続する人をリッスンし、サーバーの名前を送り返します。しかし、繰り返しになりますが、パラドックスが発生します。クライアントはこのデータを取得するためにサーバーに接続できません。

だから、この難しい部分を克服する方法。(他のJavaライブラリを使用する方法があれば、それも大丈夫です)。

4

1 に答える 1

1

いいえ、できません。そのため、ハードコードされた情報(URLなど)を使用して到達できる一種の「ブローカー」である一元化されたコンポーネントがあり、利用可能なリソースのリストが利用可能です。したがって、利用可能なゲームサーバーが登録する中央サーバーが必要であり、クライアントはリストを取得できます。

(ハードコードを除いて、サーバーの名前をクライアントコードに直接入力しますが、これは非常に効果的ではありません。たとえば、LANゲームを作成する場合、ゲームを実行する前にサーバーの名前を知ることはできません)

接続したいサーバーをユーザーに尋ねてみませんか?

私はこの解決策について持っています:サーバーが作成されると、サーバーはそれらに接続する人をリッスンし、サーバーの名前を送り返します。

クライアントがサーバーを見つけたら、これは役に立たないと思います。

編集:私は質問を少し読み間違えたと思います。これが複数のネットワークセグメントで機能する必要がない場合(同じWiFiまたはLANに参加していない参加者の場合)、マルチキャストに関する参照投稿は、利用可能なサーバーを見つけるための実行可能なオプションである可能性があります。

EDIT2:コメントとして追加したかったのですが、収まりませんでした...

私は10年以上LANゲームをプレイしていなかったので、少し気が進まないかもしれませんが、1人のプレイヤーがホストとして行動し、他のプレイヤーがゲームに参加したことを覚えています。これは、そのプレーヤーがサーバーを起動し(基本的には事前定義されたポート番号をリッスンし)、他のプレーヤーがサーバーを見つけるためにマルチキャストパケットを送信することを意味します。マルチキャストとは、ネットワークセグメント上のすべての人がそれを取得し、プロセスがそのポートでリッスンし、適切なソフトウェアに支えられている場合に応答することを意味します。

したがって、この場合は、@ MichaelBが提案したガイドに従ってください。サーバーはDatagramSocketを開き、何かが到着するまで待機し、他のプレーヤーはマルチキャストパケットを送信する必要があります。サーバーは何かを送り返す必要があります。これにより、クライアント側でどのような種類のソフトウェアを通知できるかが識別されます。これは、クライアントにとって適切なサーバーであるか、同じポートを使用する他のサーバーであるかどうかを示します。

送信はそうではありませんが、ソケットからDatagramPacketを受信することは少し直感に反します。

byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

パケットを受け取ったら、次の電話をかけることができます。

SocketAddress remoteHostAddress = packet.getSocketAddress(); 

あなたのホストのアドレスを見つけるために。

これは良い助けになるはずです:データグラムクライアントとサーバーの作成

于 2012-10-10T15:05:17.373 に答える