Класс 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- если при установке значения по умолчанию времени жизни произошла ошибка ввода-вывода - См. также:
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- если при установке значения по умолчанию времени жизни произошла ошибка ввода-вывода - С тех пор:
- 1.2
- См. также:
getTTL
@Deprecated public byte getTTL() throws IOException
getTimeToLive() вместо него, который возвращает int вместо byte.- Возвращает:
- значение времени жизни по умолчанию
- Исключения:
-
IOException- если при получении значения по умолчанию времени жизни произошла ошибка ввода-вывода - См. также:
getTimeToLive
public int getTimeToLive() throws IOException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_MULTICAST_TTL). - Возвращает:
- значение времени жизни по умолчанию
- Исключения:
-
IOException- если при получении значения по умолчанию времени жизни произошла ошибка ввода-вывода - С тех пор:
- 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не разрешает операцию. - См. также:
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Для присоединения к группе мультиадресной рассылки вызывающий метод должен указать IP-адрес группы мультиадресной рассылки для присоединения и локальный сетевой интерфейс для приема пакетов мультиадресной рассылки.
- Аргумент
mcastaddrуказывает IP-адрес группы мультиадресной рассылки для присоединения. По историческим причинам он задается какSocketAddress. Реализация по умолчанию поддерживает толькоInetSocketAddress, и информацияportигнорируется. - Аргумент
netIfуказывает локальный интерфейс для приема пакетов мультиадресной рассылки илиnull, чтобы указать интерфейс, установленный для исходящих пакетов мультиадресной рассылки. Еслиnull, и не установлен ни один интерфейс, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкойSocketException.
Возможен вызов этого метода несколько раз для присоединения к нескольким разным группам мультиадресной рассылки или к одной и той же группе в нескольких разных сетях. Однако, если сокет уже является членом группы, будет выброшено исключение IOException.
Если существует менеджер безопасности, этот метод сначала вызывает метод checkMulticast с аргументом mcastaddr в качестве аргумента.
- Overrides:
-
joinGroupв классеDatagramSocket - Параметры:
-
mcastaddr- указывает адрес мультиадресной рассылки для присоединения. -
netIf- указывает локальный интерфейс для приема пакетов мультиадресной рассылки илиnull. - Исключение:
-
IOException- если произошла ошибка при присоединении, или когда адрес не является адресом мультиадресной рассылки, или платформа не поддерживает мультиадресную рассылку -
SecurityException- если менеджер безопасности существует и его методcheckMulticastне разрешает присоединение. -
IllegalArgumentException- если mcastaddrnullили является подклассом SocketAddress, не поддерживаемым этим сокетом - С:
- 1.4
- См. также:
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Если существует менеджер безопасности, этот метод сначала вызывает его метод checkMulticast с аргументом mcastaddr в качестве аргумента.
- Overrides:
-
leaveGroupв классеDatagramSocket - Примечание API:
- Аргументы
mcastaddrиnetIfдолжны идентифицировать группу мультиадресной рассылки, которая ранее была присоединена к этому сокету.Возможен вызов этого метода несколько раз для выхода из нескольких разных групп мультиадресной рассылки, которые были ранее подключены, или для выхода из той же группы, которая была ранее подключена в нескольких разных сетях. Однако, если сокет не является членом указанной группы в указанной сети, будет выброшено исключение
IOException. - Параметры:
-
mcastaddr- это адрес мультиадресной рассылки, из которого необходимо выйти. Он должен содержать тот же IP-адрес, что и используемый для присоединения к группе. -
netIf- указывает локальный интерфейс илиnullдля использования интерфейса, установленного для исходящих пакетов мультиадресной рассылки. Еслиnull, и не установлен ни один интерфейс, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкойSocketException. - Исключение:
-
IOException- если произошла ошибка при выходе, или когда адрес не является адресом мультиадресной рассылки. -
SecurityException- если менеджер безопасности существует и его методcheckMulticastне разрешает операцию. -
IllegalArgumentException- если mcastaddrnullили является подклассом SocketAddress, не поддерживаемым этим сокетом. - С:
- 1.4
- См. также:
setInterface
@Deprecated(since="14") public void setInterface(InetAddress inf) throws SocketException
setNetworkInterface(NetworkInterface) вместо этого.- Параметры:
-
inf- InetAddress - Исключение:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - См. также:
getInterface
@Deprecated(since="14") public InetAddress getInterface() throws SocketException
getNetworkInterface() вместо этого.- Возвращает:
- InetAddress, представляющий адрес сетевого интерфейса, используемого для пакетов мультиадресной рассылки, или если не установлен ни один интерфейс, InetAddress, представляющий любой локальный адрес.
- Исключение:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - См. также:
setNetworkInterface
public void setNetworkInterface(NetworkInterface netIf) throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf). - Параметры:
-
netIf- интерфейс - Исключение:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - С:
- 1.4
- См. также:
getNetworkInterface
public NetworkInterface getNetworkInterface() throws SocketException
- Примечание API:
- Когда интерфейс установлен, этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_MULTICAST_IF). - Возвращает:
- Установленный в настоящее время интерфейс мультиадресной рассылки. Когда интерфейс не установлен, возвращается плейсхолдер NetworkInterface; в нем содержится единственный InetAddress для представления любого локального адреса.
- Исключение:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - С:
- 1.4
- См. также:
setLoopbackMode
@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для отключения режима LoopbackMode - Исключение:
-
SocketException- если произошла ошибка при установке значения - С:
- 1.4
- См. также:
getLoopbackMode
@Deprecated(since="14") public boolean getLoopbackMode() throws SocketException
DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.- Возвращает:
- true, если режим LoopbackMode отключен
- Исключение:
-
SocketException- если произошла ошибка при получении значения - С:
- 1.4
- См. также:
Отправить
@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, 2023, 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/21/docs/api/java.base/java/net/MulticastSocket.html