Класс 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() |
Устарело, предполагается удаление: Этот элемент API может быть удален в будущей версии. используйте метод getTimeToLive() вместо этого, который возвращает int вместо byte. |
void |
joinGroup |
Устарело. Этот метод не принимает сетевой интерфейс, на котором следует присоединиться к группе мультивещания. |
void |
joinGroup |
Присоединяется к группе мультивещания. |
void |
leaveGroup |
Устарело. Этот метод не принимает сетевой интерфейс, на котором следует выйти из группы мультивещания. |
void |
leaveGroup |
Выход из группы мультивещания на указанном локальном интерфейсе. |
void |
send |
Устарело, предполагается удаление: Этот элемент API может быть удален в будущей версии. Используйте следующий код или его эквивалент вместо этого: |
void |
setInterface |
Устарело. Адрес InetAddress может не однозначно идентифицировать сетевой интерфейс. |
void |
setLoopbackMode |
Устарело. Используйте DatagramSocket.setOption(SocketOption, Object) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого. |
void |
setNetworkInterface |
Указать сетевой интерфейс для исходящих мультивещательных дейтаграмм, отправленных через этот сокет. |
void |
setTimeToLive |
Установить время жизни по умолчанию для мультивещательных пакетов, отправленных через этот сокет MulticastSocket, чтобы контролировать область действия мультивещания. |
void |
setTTL |
Устарело, предполагается удаление: Этот элемент API может быть удален в будущей версии. используйте метод 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. При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.
- Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода - См. также:
MulticastSocket
public MulticastSocket(int port) throws IOException
wildcard. При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.
- Параметры:
-
port- используемый порт - Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода -
IllegalArgumentException- если порт находится вне допустимого диапазона (см.IllegalArgumentException). - См. также:
MulticastSocket
public MulticastSocket(SocketAddress bindaddr) throws IOException
Если адрес null, будет создан несвязанный сокет.
При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.
- Параметры:
-
bindaddr- адрес сокета для привязки, илиnullдля несвязанного сокета. - Исключения:
-
IOException- если при создании MulticastSocket произошла ошибка ввода-вывода - С:
- 1.4
- См. также:
Подробное описание методов
setTTL
@Deprecated(forRemoval=true, since="1.2") public void setTTL(byte ttl) throws IOException
setTimeToLive(int) вместо этого, который использует int вместо byte для типа ttl. ttl — это безусловное 8-битовое значение, поэтому оно должно быть в диапазоне 0 <= ttl <= 0xFF .
- Параметры:
-
ttl- время жизни - Исключения:
-
IOException- если при установке значения времени жизни произошла ошибка ввода-вывода или сокет закрыт. - См. также:
setTimeToLive
public void setTimeToLive(int ttl) throws IOException
Значение ttl должно быть в диапазоне 0 <= ttl <=
255, иначе будет брошено исключение. Мультиадресные пакеты с TTL равным 0 не передаются по сети, но могут быть обработаны локально.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl). - Параметры:
-
ttl- время жизни - Исключения:
-
IOException- если при установке значения времени жизни произошла ошибка ввода-вывода или сокет закрыт. - С:
- 1.2
- См. также:
getTTL
@Deprecated(forRemoval=true, since="1.2") 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.- Примечание API:
- Вызов этого метода эквивалентен вызову
joinGroup(new InetSocketAddress(mcastaddr, 0), null). - Параметры:
-
mcastaddr- адрес мультиадресной группы - Исключения:
-
IOException- если произошла ошибка при присоединении, или адрес не является мультиадресным, или платформа не поддерживает мультиадресацию, или сокет закрыт.
leaveGroup
@Deprecated(since="14") public void leaveGroup(InetAddress mcastaddr) throws IOException
leaveGroup(SocketAddress, NetworkInterface) вместо этого.setInterface или setNetworkInterface.- Примечание API:
- Вызов этого метода эквивалентен вызову
leaveGroup(new InetSocketAddress(mcastaddr, 0), null). - Параметры:
-
mcastaddr- адрес мультиадресной группы для выхода - Исключения:
-
IOException- если произошла ошибка при выходе, или адрес не является мультиадресным, или сокет закрыт.
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Для подключения к группе многоадресной рассылки вызывающий должен указать IP-адрес группы многоадресной рассылки для подключения и локальный сетевой интерфейс для приема пакетов многоадресной рассылки.
- Аргумент
mcastaddrуказывает IP-адрес группы многоадресной рассылки для подключения. По историческим причинам он задается какSocketAddress. Реализация по умолчанию поддерживает толькоInetSocketAddress, и информацияportигнорируется. - Аргумент
netIfзадаёт локальный интерфейс для приема пакетов многоадресной рассылки илиnull, чтобы использовать интерфейс, установленный для исходящих пакетов многоадресной рассылки. Еслиnullи интерфейс не был задан, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкой сSocketException.
Возможен вызов этого метода несколько раз для подключения к нескольким группам многоадресной рассылки или к одной группе в нескольких сетях. Однако, если сокет уже является членом группы, будет брошено исключение IOException.
- Overrides:
-
joinGroupв классеDatagramSocket - Параметры:
-
mcastaddr- указывает адрес группы многоадресной рассылки для подключения. -
netIf- определяет локальный интерфейс для приема пакетов многоадресной рассылки илиnull. - Исключения:
-
IOException- если произошла ошибка при подключении, или адрес не является адресом многоадресной рассылки, или платформа не поддерживает многоадресную рассылку, или сокет закрыт -
IllegalArgumentException- если mcastaddr являетсяnullили является подклассом SocketAddress, не поддерживаемым этим сокетом - С:
- 1.4
- См. также:
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
- Overrides:
-
leaveGroupв классеDatagramSocket - Примечание API:
- Аргументы
mcastaddrиnetIfдолжны указывать на группу многоадресной рассылки, которая ранее была подключена к этомуDatagramSocket.Возможен вызов этого метода несколько раз для выхода из нескольких разных групп многоадресной рассылки, которые ранее были подключены, или из той же группы, которая ранее была подключена в разных сетях. Однако, если сокет не является членом указанной группы в указанной сети, будет брошено исключение
IOException. - Параметры:
-
mcastaddr- адрес группы многоадресной рассылки для выхода. Он должен содержать тот же IP-адрес, что и тот, который использовался для подключения к группе. -
netIf- указывает локальный интерфейс илиnull, чтобы использовать интерфейс, установленный для исходящих пакетов многоадресной рассылки. Еслиnullи интерфейс не был задан, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкой сSocketException. - Исключения:
-
IOException- если произошла ошибка при выходе или когда адрес не является адресом многоадресной рассылки, или сокет закрыт. -
IllegalArgumentException- если mcastaddr являетсяnullили является подклассом 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для отключения режима локального возврата - Исключения:
-
SocketException- если произошла ошибка при установке значения, или сокет закрыт. - С:
- 1.4
- См. также:
getLoopbackMode
@Deprecated(since="14") public boolean getLoopbackMode() throws SocketException
DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.- Возвращает:
- true, если режим локального цикла был отключен
- Исключения:
-
SocketException- если произошла ошибка при получении значения, или сокет закрыт. - С:
- 1.4
- См. также:
Отправить
@Deprecated(forRemoval=true, since="1.4") 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- пакет, который необходимо отправить. Пакет должен содержать IP-адрес назначения мультикаста и данные для отправки. Для отправки пакетов в адрес назначения мультикаста не требуется быть членом группы. -
ttl- необязательное время жизни для пакета мультикаста. Значение TTL по умолчанию равно 1. - Исключения:
-
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
PortUnreachableException- может быть брошено, если сокет подключен к в настоящее время недоступному пункту назначения. Обратите внимание, что нет гарантии, что исключение будет брошено. -
IllegalArgumentException- если сокет подключен, и адрес подключения отличается от адреса пакета, или если сокет не подключен, и адрес пакета не установлен, или его порт находится вне допустимого диапазона. - См. также:
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/net/MulticastSocket.html