Spec-Zone.ru › OpenJDK 25

Класс MulticastSocket

java.lang.Object
java.net.DatagramSocket
java.net.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 для отправки и получения дейтаграмм многоадресной рассылки. 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), в котором для типа 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

Методы, объявленные в классе 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 — если порт находится вне допустимого диапазона.
См. также:
  • 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.
Задает время жизни по умолчанию для пакетов многоадресной рассылки, отправляемых через этот MulticastSocket, чтобы управлять областью распространения многоадресной рассылки.

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

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

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
См. также:
  • 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.

Переопределяет:
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
Выходит из группы многоадресной рассылки через указанный локальный интерфейс.
Переопределяет:
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 для многоадресной рассылки. Если интерфейс не задан, возвращается фиктивный 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. Режим loopback включен по умолчанию; MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false) отключает его.
Отключает или включает локальную обратную передачу дейтаграмм многоадресной рассылки. Этот параметр используется сетевым кодом платформы как подсказка при настройке того, будут ли данные многоадресной рассылки возвращаться локальному сокету.

Поскольку этот параметр является подсказкой, приложениям, которым нужно проверить установленный режим обратной передачи, следует вызвать getLoopbackMode()

Параметры:
disable — true для отключения режима LoopbackMode
Исключения:
SocketException — если при задании значения возникает ошибка или сокет закрыт.
С версии:
1.4
См. также:
  • getLoopbackMode()

getLoopbackMode

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

send

@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(DatagramPacket)
  • DatagramSocket.receive(DatagramPacket)

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

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