Класс 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). Несколько экземпляров MulticastSocket могут одновременно подписаться на одну группу и порт многоадресной рассылки, и все они будут получать дейтаграммы группы.
Классы 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), в котором для типа ttl используется int вместо byte. |
Методы, объявленные в классе 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— если порт находится вне допустимого диапазона. - См. также:
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.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(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.
- Переопределяет:
-
joinGroupв классеDatagramSocket - Параметры:
-
mcastaddr— задает адрес многоадресной рассылки для присоединения. -
netIf— задает локальный интерфейс для получения пакетов дейтаграмм многоадресной рассылки илиnull. - Исключения:
-
IOException— если при присоединении возникает ошибка, адрес не является адресом многоадресной рассылки, платформа не поддерживает многоадресную рассылку или сокет закрыт -
IllegalArgumentException— если mcastaddr равенnullили является подклассом SocketAddress, не поддерживаемым этим сокетом - С версии:
- 1.4
- См. также:
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
- Переопределяет:
-
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для многоадресной рассылки. Если интерфейс не задан, возвращается фиктивный 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. Режим loopback включен по умолчанию; 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
- См. также:
send
@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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/net/MulticastSocket.html