Класс MulticastSocket
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable
public class MulticastSocket extends DatagramSocket
MulticastSocket — это сокет для дейтаграмм, удобный для отправки и получения IP-многоадресных дейтаграмм. Конструкторы MulticastSocket создают сокет с соответствующими параметрами сокета, которые делают его подходящим для получения многоадресных дейтаграмм. Класс MulticastSocket дополнительно определяет удобные методы-сеттеры и геттеры для параметров сокета, которые обычно используются многоадресными приложениями. Подключение к одному или нескольким многоадресным группам позволяет получать многоадресные дейтаграммы, отправленные в эти группы.
IPv4-многоадресная группа задаётся IP-адресом класса D и стандартным номером порта UDP. IP-адреса класса D находятся в диапазоне 224.0.0.0 по 239.255.255.255, включительно. Адрес 224.0.0.0 зарезервирован и не должен использоваться.
Чтобы присоединиться к многоадресной группе, необходимо сначала создать MulticastSocket с нужным портом, а затем вызвать метод joinGroup, указав адрес группы и сетевой интерфейс, через который будут приниматься многоадресные дейтаграммы:
// join a Multicast group and send the group salutations
...
String msg = "Hello";
InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
InetSocketAddress group = new InetSocketAddress(mcastaddr, 6789);
NetworkInterface netIf = NetworkInterface.getByName("bge0");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(new InetSocketAddress(mcastaddr, 0), netIf);
byte[] msgBytes = msg.getBytes(StandardCharsets.UTF_8);
DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, group);
s.send(hi);
// get their responses!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// OK, I'm done talking - leave the group...
s.leaveGroup(group, netIf);
Когда кто-то отправляет сообщение в многоадресную группу, все подписавшиеся получатели на этом хосте и порту получают это сообщение (в пределах времени жизни пакета, см. ниже). Сокету не обязательно быть участником многоадресной группы для отправки сообщений в неё. Когда сокет подписывается на многоадресную группу/порт, он получает дейтаграммы, отправленные другими хостами в эту группу/порт, как и все остальные члены группы и порта. Сокет отказывается от членства в группе путём вызова метода leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf). Несколько MulticastSockets могут одновременно подписаться на многоадресную группу и порт, и они все будут получать многоадресные дейтаграммы.
Классы DatagramSocket и MulticastSocket определяют удобные методы для установки и получения нескольких параметров сокета. Как и DatagramSocket, этот класс также поддерживает методы setOption и getOption для установки и запроса параметров сокета. Множество поддерживаемых параметров сокета определено в DatagramSocket. Дополнительные (специфичные для реализации) параметры также могут быть поддерживаемы.
- Примечание API:
-
DatagramSocketможет использоваться напрямую для отправки и получения многоадресных дейтаграмм.DatagramChannelреализует интерфейсMulticastChannelи предоставляет альтернативный API для отправки и получения многоадресных дейтаграмм. APIMulticastChannelподдерживает как многоадресную рассылку любого источника, так и многоадресную рассылку с указанием источника. Рассмотрите возможность использованияDatagramChannelдля многоадресной рассылки. - С:
- 1.1
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
MulticastSocket() |
Конструирует многоадресный сокет и связывает его с любым доступным портом на локальном хосте. |
MulticastSocket |
Конструирует многоадресный сокет и связывает его с указанным портом на локальном хосте. |
MulticastSocket |
Создаёт многоадресный сокет, привязанный к указанному локальному адресу сокета. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
InetAddress |
getInterface() |
Устарело. Сетевой интерфейс может не быть однозначно определён возвращаемым InetAddress. |
boolean |
getLoopbackMode() |
Устарело. Используйте DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого. |
NetworkInterface |
getNetworkInterface() |
Получить сетевой интерфейс многоадресной рассылки, заданный для исходящих многоадресных дейтаграмм, отправленных из этого сокета. |
int |
getTimeToLive() |
Получить значение по умолчанию для времени жизни многоадресных пакетов, отправленных через сокет. |
byte |
getTTL() |
Устарело. Используйте метод getTimeToLive() вместо этого, который возвращает int вместо byte. |
void |
joinGroup |
Устарело. Этот метод не принимает сетевой интерфейс, на котором необходимо присоединиться к многоадресной группе. |
void |
joinGroup |
Подключается к многоадресной группе. |
void |
leaveGroup |
Устарело. Этот метод не принимает сетевой интерфейс, с которого необходимо выйти из многоадресной группы. |
void |
leaveGroup |
Выход из многоадресной группы на указанном локальном интерфейсе. |
void |
send |
Устарело. Используйте следующий код или его эквивалент вместо этого: |
void |
setInterface |
Устарело. InetAddress может не однозначно идентифицировать сетевой интерфейс. |
void |
setLoopbackMode |
Устарело. Используйте DatagramSocket.setOption(SocketOption, Object) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого. |
void |
setNetworkInterface |
Указывает сетевой интерфейс для исходящих многоадресных дейтаграмм, отправляемых через этот сокет. |
void |
setTimeToLive |
Устанавливает время жизни по умолчанию для многоадресных пакетов, отправляемых из этого MulticastSocket, для управления областью действия многоадресной рассылки. |
void |
setTTL |
Устарело. Используйте метод setTimeToLive(int) вместо этого, который использует int вместо byte в качестве типа для ttl. |
Методы, унаследованные от класса java.net.DatagramSocket
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getOption, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setOption, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass, supportedOptions
Подробное описание конструкторов
MulticastSocket
public MulticastSocket() throws IOException
wildcard. Если существует менеджер безопасности, его метод checkListen вызывается в первую очередь с аргументом 0, чтобы убедиться в разрешении операции. Это может привести к исключению SecurityException.
При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции сокета SO_REUSEADDR.
- Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. - См. также:
MulticastSocket
public MulticastSocket(int port) throws IOException
wildcard. Если существует менеджер безопасности, его метод checkListen вызывается в первую очередь с аргументом port для обеспечения разрешения операции. Это может привести к исключению SecurityException.
При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции сокета SO_REUSEADDR.
- Параметры:
-
port- используемый порт - Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если порт находится вне допустимого диапазона. - См. также:
MulticastSocket
public MulticastSocket(SocketAddress bindaddr) throws IOException
Если адрес null будет создан сокет без привязки.
Если существует менеджер безопасности, его метод checkListen вызывается в первую очередь с портом SocketAddress в качестве аргумента, чтобы обеспечить разрешение операции. Это может привести к исключению SecurityException.
При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции сокета SO_REUSEADDR.
- Параметры:
-
bindaddr- Адрес сокета для привязки илиnullдля сокета без привязки. - Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. - С:
- 1.4
- См. также:
Подробное описание методов
setTTL
@Deprecated public void setTTL(byte ttl) throws IOException
setTimeToLive(int) вместо него, который использует int вместо byte в качестве типа для ttl.MulticastSocket, чтобы контролировать область действия мультикаста. ttl – это безусловное 8-битовое значение и поэтому должно находиться в диапазоне 0 <= ttl <= 0xFF .
- Параметры:
-
ttl- время жизни - Исключения:
-
IOException- если при установке значения по умолчанию time-to-live произошла ошибка ввода-вывода - См. также:
setTimeToLive
public void setTimeToLive(int ttl) throws IOException
MulticastSocket, чтобы контролировать область действия мультикаста. ttl должен находиться в диапазоне 0 <= ttl <=
255 или будет брошено IllegalArgumentException. Пакеты мультикаста, отправленные с TTL 0, не передаются по сети, но могут быть доставлены локально.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl). - Параметры:
-
ttl- время жизни - Исключения:
-
IOException- если при установке значения по умолчанию time-to-live произошла ошибка ввода-вывода - С:
- 1.2
- См. также:
getTTL
@Deprecated public byte getTTL() throws IOException
getTimeToLive() вместо него, который возвращает int вместо byte.- Возвращает:
- значение по умолчанию time-to-live
- Исключения:
-
IOException- если при получении значения по умолчанию time-to-live произошла ошибка ввода-вывода - См. также:
getTimeToLive
public int getTimeToLive() throws IOException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_MULTICAST_TTL). - Возвращает:
- значение по умолчанию time-to-live
- Исключения:
-
IOException- если при получении значения по умолчанию time-to-live произошла ошибка ввода-вывода - С:
- 1.2
- См. также:
joinGroup
@Deprecated(since="14") public void joinGroup(InetAddress mcastaddr) throws IOException
joinGroup(SocketAddress, NetworkInterface) вместо этого.setInterface или setNetworkInterface. Если существует менеджер безопасности, этот метод сначала вызывает его метод checkMulticast с аргументом mcastaddr.
- Примечание API:
- Вызов этого метода эквивалентен вызову
joinGroup(new InetSocketAddress(mcastaddr, 0), null). - Параметры:
-
mcastaddr- адрес мультикаста для присоединения - Исключения:
-
IOException- если при присоединении произошла ошибка, или адрес не является адресом мультикаста, или платформа не поддерживает мультикаст -
SecurityException- если менеджер безопасности существует и его методcheckMulticastне разрешает присоединение. - См. также:
leaveGroup
@Deprecated(since="14") public void leaveGroup(InetAddress mcastaddr) throws IOException
leaveGroup(SocketAddress, NetworkInterface) вместо этого.setInterface или setNetworkInterface. Если существует менеджер безопасности, этот метод сначала вызывает его метод checkMulticast с аргументом mcastaddr.
- Примечание API:
- Вызов этого метода эквивалентен вызову
leaveGroup(new InetSocketAddress(mcastaddr, 0), null). - Параметры:
-
mcastaddr- адрес мультикаста для выхода - Исключения:
-
IOException- если при выходе произошла ошибка или адрес не является адресом мультикаста. -
SecurityException- если менеджер безопасности существует и его методcheckMulticastне разрешает операцию. - См. также:
присоединитьсяКГруппе
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Для присоединения к мультигруппе вызывающий объект должен указать IP-адрес мультигруппы и локальный сетевой интерфейс для получения пакетов мультигруппы.
- Аргумент
mcastaddrуказывает IP-адрес мультигруппы для присоединения. По историческим причинам это указывается какSocketAddress. Реализация по умолчанию поддерживает толькоInetSocketAddress, и информация о портеportигнорируется. - Аргумент
netIfуказывает локальный интерфейс для приема пакетов мультигрупповых датаграмм илиnull, чтобы использовать интерфейс, установленный для исходящих пакетов мультигруппы. Еслиnull, и интерфейс не установлен, поведение не определено: может быть выбран любой интерфейс, или операция может завершиться ошибкой сSocketException.
Этот метод можно вызывать несколько раз, чтобы присоединиться к нескольким различным мультигруппам или присоединиться к одной группе в нескольких разных сетях. Однако, если сокет уже является членом группы, будет брошено исключение IOException.
Если есть менеджер безопасности, этот метод сначала вызывает его метод checkMulticast с аргументом mcastaddr.
- Переопределяет:
-
joinGroupв классеDatagramSocket - Параметры:
-
mcastaddr- указывает адрес мультигруппы для присоединения. -
netIf- указывает локальный интерфейс для приема пакетов мультигрупповых датаграмм илиnull. - Исключения:
-
IOException- если произошла ошибка при присоединении, или когда адрес не является мультиадресным, или платформа не поддерживает мультивещание -
SecurityException- если существует менеджер безопасности, и его методcheckMulticastне разрешает присоединение. -
IllegalArgumentException- если mcastaddrnullили является подклассом SocketAddress, не поддерживаемым этим сокетом - С:
- 1.4
- См. также:
выйтиИзГруппы
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Если есть менеджер безопасности, этот метод сначала вызывает его метод checkMulticast с аргументом mcastaddr.
- Переопределяет:
-
leaveGroupв классеDatagramSocket - Примечание API:
- Аргументы
mcastaddrиnetIfдолжны идентифицировать мультигруппу, которая ранее была присоединена к этомуDatagramSocket.Этот метод можно вызывать несколько раз, чтобы выйти из нескольких разных мультигрупп, к которым ранее присоединялись, или выйти из одной и той же группы, к которой ранее присоединялись в нескольких разных сетях. Однако, если сокет не является членом указанной группы в указанной сети, будет брошено исключение
IOException. - Параметры:
-
mcastaddr- это адрес мультигруппы, из которой необходимо выйти. Он должен содержать тот же IP-адрес, что и тот, который использовался для присоединения к группе. -
netIf- указывает локальный интерфейс илиnullдля перехода к интерфейсу, установленному для исходящих мультигрупповых датаграмм. Еслиnull, и интерфейс не установлен, поведение не определено: может быть выбран любой интерфейс, или операция может завершиться ошибкой сSocketException. - Исключения:
-
IOException- если произошла ошибка при выходе, или когда адрес не является мультиадресным. -
SecurityException- если существует менеджер безопасности, и его методcheckMulticastне разрешает операцию. -
IllegalArgumentException- если mcastaddrnullили является подклассом SocketAddress, не поддерживаемым этим сокетом. - С:
- 1.4
- См. также:
установитьИнтерфейс
@Deprecated(since="14") public void setInterface(InetAddress inf) throws SocketException
setNetworkInterface(NetworkInterface) вместо этого.- Параметры:
-
inf- InetAddress - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - См. также:
получитьИнтерфейс
@Deprecated(since="14") public InetAddress getInterface() throws SocketException
getNetworkInterface() вместо этого.- Возвращает:
InetAddress, представляющий адрес сетевого интерфейса, используемого для пакетов мультигруппы, или если интерфейс не установлен,InetAddress, представляющий любой локальный адрес.- Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - См. также:
установитьСетевойИнтерфейс
public void setNetworkInterface(NetworkInterface netIf) throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf). - Параметры:
-
netIf- интерфейс - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - С:
- 1.4
- См. также:
получитьСетевойИнтерфейс
public NetworkInterface getNetworkInterface() throws SocketException
- Примечание API:
- Когда интерфейс установлен, этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_MULTICAST_IF). - Возвращает:
- Установленный в данный момент интерфейс мультигруппы.
NetworkInterfaceвозвращается, если интерфейс не установлен; он содержит единственный InetAddress для представления любого локального адреса. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - С:
- 1.4
- См. также:
установитьРежимПетли
@Deprecated(since="14") public void setLoopbackMode(boolean disable) throws SocketException
DatagramSocket.setOption(SocketOption, Object) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого. Режим петли включен по умолчанию, MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false) отключает его.Поскольку эта опция является подсказкой, приложения, которые хотят проверить, какой режим петли установлен, должны вызвать getLoopbackMode()
- Параметры:
-
disable-trueдля отключения режима петли - Исключения:
-
SocketException- если произошла ошибка при установке значения - С:
- 1.4
- См. также:
получитьРежимПетли
@Deprecated(since="14") public boolean getLoopbackMode() throws SocketException
DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.- Возвращает:
- true, если режим петли был отключен
- Исключения:
-
SocketException- если произошла ошибка при получении значения - С:
- 1.4
- См. также:
send
@Deprecated public void send(DatagramPacket p, byte ttl) throws IOException
......
int ttl = mcastSocket.getOption(StandardSocketOptions.IP_MULTICAST_TTL);
mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, newttl);
mcastSocket.send(p);
mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl);
......
setInterface. Если существует менеджер безопасности, этот метод сначала выполняет некоторые проверки безопасности. Во-первых, если p.getAddress().isMulticastAddress() истинно, этот метод вызывает метод менеджера безопасности checkMulticast с p.getAddress() и ttl в качестве аргументов. Если результат вычисления этого выражения ложно, этот метод вместо этого вызывает метод менеджера безопасности checkConnect с аргументами p.getAddress().getHostAddress() и p.getPort(). Каждый вызов метода менеджера безопасности может привести к исключению SecurityException, если операция не разрешена.
- Параметры:
-
p- пакет, который нужно отправить. Пакет должен содержать адрес IP целевого многоадресной группы и данные, которые нужно отправить. Для отправки пакетов на адрес назначения многоадресной группы не обязательно быть членом группы. -
ttl- необязательное время жизни для пакета многоадресной рассылки. Значение TTL по умолчанию равно 1. - Исключения:
-
IOException- возникает, если произошла ошибка, например, ошибка при установке TTL. -
SecurityException- если менеджер безопасности существует и его методcheckMulticastилиcheckConnectне разрешает отправку. -
PortUnreachableException- может быть вызвано, если сокет подключен к в настоящее время недоступному пункту назначения. Заметим, что нет гарантии, что исключение будет выброшено. -
IllegalArgumentException- если сокет подключен, и адрес подключения отличается от адреса пакета, или если сокет не подключен, и адрес пакета не задан, или если его порт находится вне диапазона. - См. также:
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/MulticastSocket.html