Spec-Zone .ru
спецификации, руководства, описания, API
|
В дополнение к DatagramSocket
, который позволяет программам отправлять пакеты друг другу, java.net включает вызванный class MulticastSocket
. Этот вид сокета используется на стороне клиента, чтобы прислушаться к пакетам что широковещательные сообщения сервера многократным клиентам.
Давайте перепишем сервер кавычки так, чтобы он широковещательно передал DatagramPacket
s многократным получателям. Вместо того, чтобы отправить кавычки определенному клиенту, который обращается с просьбой, новый сервер теперь должен широковещательно передать кавычки в равном интервале. Клиент должен быть изменен так, чтобы это пассивно прислушалось к кавычкам и сделало так на 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
это идентифицирует группу. Теперь, клиент устанавливается, чтобы получить DatagramPacket
s, предназначенный для порта и группы, определяется. Вот соответствующий код из новой клиентской программы (который был также переписан, чтобы пассивно получить кавычки, а не активно запросить их). Полужирные операторы - те, которые взаимодействуют 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
и несколько клиентов. Смотрите, как клиенты все получают те же самые кавычки.