Spec-Zone.ru › OpenJDK 24

Класс MulticastSocket

java.lang.Object
java.net.DatagramSocket
java.net.MulticastSocket
Все реализованные интерфейсы:
Closeable, AutoCloseable
public class MulticastSocket extends DatagramSocket
A 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 для отправки и получения мультивещательных дейтаграмм. API MulticastChannel поддерживает как мультивещание любого источника, так и специфичного источника. Рассмотрите использование класса DatagramChannel для мультивещания.
С:
1.1

Краткое описание конструкторов

Конструктор Описание
MulticastSocket()
Создаёт сокет мультивещания и связывает его с любым доступным портом на локальном хосте.
MulticastSocket(int port)
Создаёт сокет мультивещания и связывает его с указанным портом на локальном хосте.
MulticastSocket(SocketAddress bindaddr)
Создаёт сокет мультивещания, привязанный к указанному локальному адресу сокета.

Краткое описание методов

Модификатор и тип Метод Описание
InetAddress getInterface()
Устарело.
Сетевой интерфейс может не быть однозначно идентифицирован возвращаемым объектом InetAddress.
boolean getLoopbackMode()
Устарело.
Используйте DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.
NetworkInterface getNetworkInterface()
Получить сетевой интерфейс мультивещания, установленный для исходящих мультивещательных дейтаграмм, отправленных из этого сокета.
int getTimeToLive()
Получить значение по умолчанию для времени жизни мультивещательных пакетов, отправленных через этот сокет.
byte getTTL()
Устарело, предполагается удаление: Этот элемент API может быть удален в будущей версии.
используйте метод getTimeToLive() вместо этого, который возвращает int вместо byte.
void joinGroup(InetAddress mcastaddr)
Устарело.
Этот метод не принимает сетевой интерфейс, на котором следует присоединиться к группе мультивещания.
void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
Присоединяется к группе мультивещания.
void leaveGroup(InetAddress mcastaddr)
Устарело.
Этот метод не принимает сетевой интерфейс, на котором следует выйти из группы мультивещания.
void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
Выход из группы мультивещания на указанном локальном интерфейсе.
void send(DatagramPacket p, byte ttl)
Устарело, предполагается удаление: Этот элемент API может быть удален в будущей версии.
Используйте следующий код или его эквивалент вместо этого:
void setInterface(InetAddress inf)
Устарело.
Адрес InetAddress может не однозначно идентифицировать сетевой интерфейс.
void setLoopbackMode(boolean disable)
Устарело.
Используйте DatagramSocket.setOption(SocketOption, Object) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.
void setNetworkInterface(NetworkInterface netIf)
Указать сетевой интерфейс для исходящих мультивещательных дейтаграмм, отправленных через этот сокет.
void setTimeToLive(int ttl)
Установить время жизни по умолчанию для мультивещательных пакетов, отправленных через этот сокет MulticastSocket, чтобы контролировать область действия мультивещания.
void setTTL(byte ttl)
Устарело, предполагается удаление: Этот элемент 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

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

MulticastSocket

public MulticastSocket() throws IOException
Создаёт сокет для работы с мультиадресной рассылкой и связывает его с любым доступным портом на локальном компьютере. Сокет будет привязан к адресу wildcard.

При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.

Исключения:
IOException - если при создании MulticastSocket произошла ошибка ввода-вывода
См. также:
  • DatagramSocket.setReuseAddress(boolean)
  • DatagramSocketImpl.setOption(SocketOption, Object)

MulticastSocket

public MulticastSocket(int port) throws IOException
Создаёт сокет для работы с мультиадресной рассылкой и связывает его с указанным портом на локальном компьютере. Сокет будет привязан к адресу wildcard.

При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.

Параметры:
port - используемый порт
Исключения:
IOException - если при создании MulticastSocket произошла ошибка ввода-вывода
IllegalArgumentException - если порт находится вне допустимого диапазона (см. IllegalArgumentException).
См. также:
  • DatagramSocket.setReuseAddress(boolean)

MulticastSocket

public MulticastSocket(SocketAddress bindaddr) throws IOException
Создаёт сокет для работы с мультиадресной рассылкой, привязанный к указанному локальному адресу сокета.

Если адрес null, будет создан несвязанный сокет.

При создании сокета вызывается метод DatagramSocket.setReuseAddress(boolean) для включения опции SO_REUSEADDR.

Параметры:
bindaddr - адрес сокета для привязки, или null для несвязанного сокета.
Исключения:
IOException - если при создании MulticastSocket произошла ошибка ввода-вывода
С:
1.4
См. также:
  • DatagramSocket.setReuseAddress(boolean)

Подробное описание методов

setTTL

@Deprecated(forRemoval=true, since="1.2") public void setTTL(byte ttl) throws IOException
Устарело, для удаления: Этот элемент API может быть удален в будущей версии.
Используйте метод setTimeToLive(int) вместо этого, который использует int вместо byte для типа ttl.
Устанавливает значение времени жизни для мультиадресных пакетов, отправляемых через этот сокет, для управления областью действия мультиадресной рассылки.

ttl — это безусловное 8-битовое значение, поэтому оно должно быть в диапазоне 0 <= ttl <= 0xFF .

Параметры:
ttl - время жизни
Исключения:
IOException - если при установке значения времени жизни произошла ошибка ввода-вывода или сокет закрыт.
См. также:
  • getTTL()

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
См. также:
  • getTimeToLive()
  • StandardSocketOptions.IP_MULTICAST_TTL

getTTL

@Deprecated(forRemoval=true, since="1.2") public byte getTTL() throws IOException
Устарело, для удаления: Этот элемент API может быть удален в будущей версии.
Используйте метод getTimeToLive() вместо этого, который возвращает int вместо byte.
Получение значения времени жизни для мультиадресных пакетов, отправляемых через сокет.
Возвращает:
значение по умолчанию для времени жизни
Исключения:
IOException - если при получении значения времени жизни произошла ошибка ввода-вывода или сокет закрыт.
См. также:
  • setTTL(byte)

getTimeToLive

public int getTimeToLive() throws IOException
Получение значения времени жизни для мультиадресных пакетов, отправляемых через сокет.
Примечание API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.IP_MULTICAST_TTL).
Возвращает:
значение по умолчанию для времени жизни
Исключения:
IOException - если при получении значения времени жизни произошла ошибка ввода-вывода или сокет закрыт.
С:
1.2
См. также:
  • setTimeToLive(int)
  • StandardSocketOptions.IP_MULTICAST_TTL

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
См. также:
  • MulticastChannel.join(InetAddress, NetworkInterface)
  • StandardSocketOptions.IP_MULTICAST_IF
  • setNetworkInterface(NetworkInterface)
  • setInterface(InetAddress)

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
См. также:
  • joinGroup(SocketAddress, NetworkInterface)

setInterface

@Deprecated(since="14") public void setInterface(InetAddress inf) throws SocketException
Устарело.
InetAddress может не однозначно идентифицировать сетевой интерфейс. Используйте setNetworkInterface(NetworkInterface) вместо этого.
Устанавливает сетевой интерфейс многоадресной рассылки, используемый методами, поведение которых зависит от значения сетевого интерфейса. Полезно для узлов с несколькими сетевыми картами.
Параметры:
inf - InetAddress
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка TCP, или сокет закрыт.
См. также:
  • getInterface()

getInterface

@Deprecated(since="14") public InetAddress getInterface() throws SocketException
Устарело.
Сетевой интерфейс может не быть однозначно идентифицирован возвращаемым InetAddress. Используйте getNetworkInterface() вместо этого.
Получение адреса сетевого интерфейса, используемого для пакетов многоадресной рассылки.
Возвращает:
InetAddress, представляющий адрес сетевого интерфейса, используемого для пакетов многоадресной рассылки, или если интерфейс не задан, InetAddress, представляющий любой локальный адрес.
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка TCP, или сокет закрыт.
См. также:
  • setInterface(java.net.InetAddress)

setNetworkInterface

public void setNetworkInterface(NetworkInterface netIf) throws SocketException
Задает сетевой интерфейс для исходящих пакетов многоадресной рассылки, отправляемых по этому сокету.
Примечание API:
Этот метод эквивалентен вызову setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf).
Параметры:
netIf - интерфейс
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка TCP, или сокет закрыт.
С:
1.4
См. также:
  • getNetworkInterface()
  • StandardSocketOptions.IP_MULTICAST_IF

getNetworkInterface

public NetworkInterface getNetworkInterface() throws SocketException
Получение сетевого интерфейса многоадресной рассылки, установленного для исходящих пакетов многоадресной рассылки, отправляемых с этого сокета.
Примечание API:
Когда интерфейс установлен, этот метод эквивалентен вызову getOption(StandardSocketOptions.IP_MULTICAST_IF).
Возвращает:
Установленный в данный момент интерфейс многоадресной рассылки. Возвращается заглушка NetworkInterface, когда интерфейс не задан; она содержит единственный InetAddress для представления любого локального адреса.
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка TCP, или сокет закрыт.
С:
1.4
См. также:
  • setNetworkInterface(NetworkInterface)
  • StandardSocketOptions.IP_MULTICAST_IF

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()

getLoopbackMode

@Deprecated(since="14") public boolean getLoopbackMode() throws SocketException
Устарело.
Используйте DatagramSocket.getOption(SocketOption) с StandardSocketOptions.IP_MULTICAST_LOOP вместо этого.
Получение настройки для локального цикла многоадресных пакетов.
Возвращает:
true, если режим локального цикла был отключен
Исключения:
SocketException - если произошла ошибка при получении значения, или сокет закрыт.
С:
1.4
См. также:
  • setLoopbackMode(boolean)

Отправить

@Deprecated(forRemoval=true, since="1.4") public void send(DatagramPacket p, byte ttl) throws IOException
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Используйте следующий код или его эквивалент вместо него:
  ......
  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);
  ......
Отправляет пакет данных в пункт назначения с TTL (временем жизни) отличным от значения по умолчанию для сокета. Данный метод необходимо использовать только в тех случаях, когда требуется конкретное значение TTL; в противном случае предпочтительнее установить TTL один раз для сокета и использовать это значение по умолчанию для всех пакетов. Этот метод не изменяет значение TTL по умолчанию для сокета. Его поведение может быть затронуто setInterface.
Параметры:
p - пакет, который необходимо отправить. Пакет должен содержать IP-адрес назначения мультикаста и данные для отправки. Для отправки пакетов в адрес назначения мультикаста не требуется быть членом группы.
ttl - необязательное время жизни для пакета мультикаста. Значение TTL по умолчанию равно 1.
Исключения:
IOException - если произошла ошибка ввода-вывода или сокет закрыт.
PortUnreachableException - может быть брошено, если сокет подключен к в настоящее время недоступному пункту назначения. Обратите внимание, что нет гарантии, что исключение будет брошено.
IllegalArgumentException - если сокет подключен, и адрес подключения отличается от адреса пакета, или если сокет не подключен, и адрес пакета не установлен, или его порт находится вне допустимого диапазона.
См. также:
  • DatagramSocket.send(java.net.DatagramPacket)
  • DatagramSocket.receive(java.net.DatagramPacket)

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API