私はJavaで、2〜4人のプレーヤーがいるクラシックな5枚のカードポーカーをシミュレートするゲームを作成しています。ほとんどのデータはサーバーで処理されますが、オンラインサーバーを使用できないため、ユーザーがローカルサーバーを作成してゲームをホストできるようにすることを考えています。
今、私はIPを使用してゲームに接続することを強制したくないので、ユーザー内に利用可能なすべてのゲームを表示できる「検出」インターフェイスを作成しました。これは、UDPプロトコルと共通グループのブロードキャスト調査を使用して行われます。
(コードは、実行されたアクションのみを表示するように簡略化されています。ここに示されているように機能しない場合があります)
クライアント
MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);
DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0xF0}, 1, group, 6020);
socket.send(packet);
while(true) {
buf = new byte[1];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
if(packet.getData()[0] == 15) {
Socket client = new Socket(packet.getAddress(), 6020);
}
}
サーバ
MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);
// new thread listening on port 6020 TCP
ServerSocket server = new ServerSocket(6020);
new Thread(new Runnable() {
public void run() {
while(true) {
// new thread communicating with client and back listening on port 6020
new ServerThread(server.accept());
}
}
}).start();
// listening on port 6020 UDP
byte[] buf;
DatagramPacket packet;
while(true) {
buf = new byte[1];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
if(packet.getData()[0] == -16) {
DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0x0F}, 1, packet.getSocketAddress());
socket.send(packet);
}
}
クライアントはポート6020でUDPブロードキャストパケットを送信します。サーバーがこのパケットをバイト0xF0で構成されている場合に受信すると、サーバーはバイト0x0Fをクライアントに送り返します。すべてのクライアントはポート6020でもリッスンしており、バイト0x0Fで構成されるパケットを受信すると、ポート6020でサーバーへの新しい接続TCPを開始します。
私の質問:この「発見」システムを実現するためのより良い方法はありますか?これはローカルネットワークでのみ機能することを知っていますが、ローカルサーバーを使用して検出を「外部」に拡張することは可能ですか?