Spec-Zone .ru
спецификации, руководства, описания, API
След: Пользовательские Сети
Урок: Все О Дейтаграммах
Широковещательная передача Многократным Получателям
Домашняя страница > Пользовательские Сети > Все О Дейтаграммах

Широковещательная передача Многократным Получателям

В дополнение к DatagramSocket, который позволяет программам отправлять пакеты друг другу, java.net включает вызванный class MulticastSocket. Этот вид сокета используется на стороне клиента, чтобы прислушаться к пакетам что широковещательные сообщения сервера многократным клиентам.

Давайте перепишем сервер кавычки так, чтобы он широковещательно передал DatagramPackets многократным получателям. Вместо того, чтобы отправить кавычки определенному клиенту, который обращается с просьбой, новый сервер теперь должен широковещательно передать кавычки в равном интервале. Клиент должен быть изменен так, чтобы это пассивно прислушалось к кавычкам и сделало так на a MulticastSocket.

Этот пример состоит из трех классов, которые являются модификациями этих трех классов от предыдущего примера: MulticastServer, MulticastServerThread, и MulticastClient. Это обсуждение выделяет интересные части этих классов.

Вот новая версия основной программы сервера. Различия между этим кодом и предыдущей версией, QuoteServer, показываются полужирным:

import java.io.*;

public class MulticastServer {
    public static void main(String[] args) throws IOException {
        new MulticastServerThread().start();
    }
}

В основном сервер получил новое имя и создает a MulticastServerThread вместо a QuoteServerThread. Теперь давайте смотреть на MulticastServerThread который содержит основу сервера. Вот его объявление class:

public class MulticastServerThread extends QuoteServerThread {
    // ...
}

Мы сделали этот class подклассом QuoteServerThread так, чтобы это могло использовать конструктора, и наследовать некоторую задействованную переменную и getNextQuote метод. Вспомните это QuoteServerThread создает a DatagramSocket обязанный портировать 4445 и открывает файл кавычки. DatagramSocket's номер порта фактически не имеет значения в этом примере, потому что клиент никогда ничего не отправляет серверу.

Единственный метод, явно реализованный в MulticastServerThread run метод. Различия между этим run метод и тот в QuoteServerThread показываются полужирным:

public void run() {
    while (moreQuotes) {
        try {
            byte[] buf = new byte[256];
            // don't wait for request...just send a quote

            String dString = null;
            if (in == null)
                dString = new Date().toString();
            else
                dString = getNextQuote();
            buf = dString.getBytes();

            InetAddress group = InetAddress.getByName("203.0.113.0");
            DatagramPacket packet;
            packet = new DatagramPacket(buf, buf.length, group, 4446);
            socket.send(packet);

            try {
                sleep((long)Math.random() * FIVE_SECONDS);
            } 
            catch (InterruptedException e) { }
        }
        catch (IOException e) {
            e.printStackTrace();
            moreQuotes = false;
        }
    }
    socket.close();
}

Интересное изменение то, как DatagramPacket создается, в частности InetAddress и порт, используемый, чтобы создать DatagramPacket. Вспомните что предыдущий пример, полученный InetAddress и номер порта от пакета, отправленного серверу от клиента. Это было то, потому что сервер должен был ответить непосредственно клиенту. Теперь, сервер должен адресовать многократные клиенты. Так на сей раз оба InetAddress и номер порта трудно кодируется.

Трудно кодированный номер порта 4446 (у клиента должен быть a MulticastSocket связанный с этим портом). Трудно кодированный InetAddress из DatagramPacket "203.0.113.0" и групповой идентификатор (а не Интернет-адрес машины, на которой единственный клиент работает). Этот определенный адрес был произвольно выбран из зарезервированного с этой целью.

Создаваемый таким образом, DatagramPacket предназначается для всех клиентов, слушающих номер порта 4446, кто элемент "203.0.113.0" групп.

Слушать номер порта 4446, новая клиентская программа, только созданная MulticastSocket с тем номером порта. Чтобы стать элементом "203.0.113.0" групп, клиент вызывает MulticastSocket's joinGroup метод с InetAddress это идентифицирует группу. Теперь, клиент устанавливается, чтобы получить DatagramPackets, предназначенный для порта и группы, определяется. Вот соответствующий код из новой клиентской программы (который был также переписан, чтобы пассивно получить кавычки, а не активно запросить их). Полужирные операторы - те, которые взаимодействуют MulticastSocket:

MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName("203.0.113.0");
socket.joinGroup(group);

DatagramPacket packet;
for (int i = 0; i < 5; i++) {
    byte[] buf = new byte[256];
    packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);

    String received = new String(packet.getData());
    System.out.println("Quote of the Moment: " + received);
}

socket.leaveGroup(group);
socket.close();

Заметьте, что сервер использует a DatagramSocket широковещательно передавать пакет, полученный клиентом по a MulticastSocket. Альтернативно, это, возможно, использовало a MulticastSocket. Сокет, используемый сервером, чтобы передаться DatagramPacket не важно. Что важно, когда широковещательная передача пакетов является адресной информацией, содержавшейся в DatagramPacket, и сокет, используемый клиентом, чтобы прислушаться к этому


Попробуйте это: 

Работайте MulticastServer и несколько клиентов. Смотрите, как клиенты все получают те же самые кавычки.



Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Запись Клиента и сервера Дейтаграммы
Следующая страница: Программируемый Доступ к Сетевым Параметрам