Обнаружение сервера вещания

Я создаю игру на Java, которая имитирует классический 5-карточный покер для 2-4 игроков. Большая часть данных будет обрабатываться сервером, но, поскольку я не могу использовать онлайн-сервер, моя идея состоит в том, чтобы позволить пользователю размещать игру, создавая локальный.

Теперь я не хочу принудительно использовать 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);
    }
}

Клиент отправляет широковещательный пакет UDP на порт 6020. Когда сервер получает этот пакет, если он состоит из байта 0xF0, он отправляет обратно байт 0x0F клиенту. Каждый клиент также прослушивает порт 6020, и при получении пакета, состоящего из байта 0x0F, он устанавливает новое подключение TCP к серверу через порт 6020.

Мой вопрос: есть ли лучший способ достичь этой системы "открытия"? Я знаю, что это будет работать только в локальных сетях, возможно ли расширить обнаружение "снаружи", используя локальный сервер?

1 ответ

Решение

Если вы не хотите устанавливать какого-либо известного брокера, который может связывать игроков с серверами (или предоставлять им список серверов), вам может не повезти. Как вы обнаружили, групповая адресация и широковещательная рассылка, как правило, не отправляются в глобальную сеть большинством коммутаторов (и определенно не могут проходить через Интернет).

Если ваша проблема с настройкой известного сервера / брокера заключается в том, что у вас есть домашнее соединение и, следовательно, динамический IP-адрес, я бы порекомендовал изучить динамический DNS. Существует ряд провайдеров, которые позволят вам настроить поддомен в своей системе, который будет автоматически изменен, чтобы указывать ваш IP при изменении вашего IP.

Другие вопросы по тегам