Класс 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() |
Возвращает время жизни по умолчанию для пакетов многоадресной рассылки, отправляемых через сокет. |
void |
joinGroup |
Устарел. Этот метод не принимает сетевой интерфейс, через который следует присоединиться к группе многоадресной рассылки. |
void |
joinGroup |
Присоединяется к группе многоадресной рассылки. |
void |
leaveGroup |
Устарел. Этот метод не принимает сетевой интерфейс, через который следует покинуть группу многоадресной рассылки. |
void |
leaveGroup |
Покидает группу многоадресной рассылки на указанном локальном интерфейсе. |
void |
setInterface |
Устарел. Сетевой интерфейс может быть неоднозначно определён по InetAddress. |
void |
setLoopbackMode |
Устарел. Вместо этого используйте DatagramSocket.setOption(SocketOption, Object) с StandardSocketOptions.IP_MULTICAST_LOOP. |
void |
setNetworkInterface |
Задаёт сетевой интерфейс для исходящих дейтаграмм многоадресной рассылки, отправляемых этим сокетом. |
void |
setTimeToLive |
Задаёт время жизни по умолчанию для пакетов многоадресной рассылки, отправляемых через этот MulticastSocket, чтобы управлять областью действия многоадресной рассылки. |
Методы, объявленные в классе 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 | Модификатор и тип | Метод | Описание |
|---|---|---|
void |
bind |
Привязывает этот DatagramSocket к определённому адресу и порту. |
void |
close() |
Закрывает этот сокет дейтаграмм. |
void |
connect |
Подключает сокет к удалённому адресу. |
void |
connect |
Подключает этот сокет к удалённому адресу сокета (IP-адрес + номер порта). |
void |
disconnect() |
Отключает сокет. |
boolean |
getBroadcast() |
Проверяет, включён ли SO_BROADCAST. |
DatagramChannel |
getChannel() |
Возвращает связанный с этим сокетом дейтаграмм уникальный объект DatagramChannel, если он существует. |
InetAddress |
getInetAddress() |
Возвращает адрес, к которому подключён этот сокет. |
InetAddress |
getLocalAddress() |
Возвращает локальный адрес, к которому привязан сокет. |
int |
getLocalPort() |
Возвращает номер порта на локальном узле, к которому привязан этот сокет. |
SocketAddress |
getLocalSocketAddress() |
Возвращает адрес конечной точки, к которой привязан этот сокет. |
<T> T |
getOption |
Возвращает значение параметра сокета. |
int |
getPort() |
Возвращает номер порта, к которому подключён этот сокет. |
int |
getReceiveBufferSize() |
Возвращает значение параметра SO_RCVBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для ввода данных через этот DatagramSocket. |
SocketAddress |
getRemoteSocketAddress() |
Возвращает адрес конечной точки, к которой подключён этот сокет, или null, если он не подключён. |
boolean |
getReuseAddress() |
Проверяет, включён ли SO_REUSEADDR. |
int |
getSendBufferSize() |
Возвращает значение параметра SO_SNDBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для вывода данных через этот DatagramSocket. |
int |
getSoTimeout() |
Возвращает значение параметра SO_TIMEOUT. Значение 0 означает, что параметр отключён (то есть время ожидания не ограничено). |
int |
getTrafficClass() |
Возвращает класс трафика или тип обслуживания в заголовке IP-дейтаграммы для пакетов, отправляемых этим DatagramSocket. |
boolean |
isBound() |
Возвращает состояние привязки сокета. |
boolean |
isClosed() |
Возвращает, закрыт ли сокет. |
boolean |
isConnected() |
Возвращает состояние подключения сокета. |
void |
receive |
Получает пакет дейтаграммы через этот сокет. |
void |
send |
Отправляет пакет дейтаграммы через этот сокет. |
void |
setBroadcast |
Включает или отключает SO_BROADCAST. |
static void |
setDatagramSocketImplFactory |
Устарел. Используйте DatagramChannel или создайте подкласс непосредственно от DatagramSocket. |
<T> DatagramSocket |
setOption |
Устанавливает значение параметра сокета. |
void |
setReceiveBufferSize |
Устанавливает для параметра SO_RCVBUF указанное значение в этом DatagramSocket. |
void |
setReuseAddress |
Включает или отключает параметр сокета SO_REUSEADDR. |
void |
setSendBufferSize |
Устанавливает для параметра SO_SNDBUF указанное значение в этом DatagramSocket. |
void |
setSoTimeout |
Включает или отключает SO_TIMEOUT, задавая время ожидания в миллисекундах. |
void |
setTrafficClass |
Устанавливает класс трафика или октет типа обслуживания в заголовке IP-дейтаграммы для дейтаграмм, отправляемых этим DatagramSocket. |
Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим сокетом. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект другому объекту. |
protected void |
finalize() |
Устарел, будет удалён: этот элемент API может быть удалён в будущей версии. Финализация устарела и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова уведомления или прерывания, либо до истечения определённого промежутка времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова уведомления или прерывания, либо до истечения определённого промежутка времени. |
Подробное описание конструкторов
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
- См. также:
Подробное описание методов
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
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. Режим обратной петли включен по умолчанию; 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
- См. также:
© 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.