Класс DatagramSocket
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable
- Непосредственные известные подклассы:
MulticastSocket
public class DatagramSocket extends Object implements Closeable
Сокет данных — это точка отправки или получения для службы доставки пакетов. Каждый пакет, отправленный или полученный через сокет данных, индивидуально адресован и маршрутизируется. Несколько пакетов, отправленных с одного компьютера на другой, могут быть маршрутизированы по-разному и могут прибыть в любом порядке.
По возможности, недавно созданный DatagramSocket имеет включённый SO_BROADCAST параметр сокета, чтобы позволить передачу широковещательных пакетов данных. Для получения широковещательных пакетов сокет DatagramSocket должен быть привязан к адресу по умолчанию. В некоторых реализациях широковещательные пакеты также могут быть получены, когда сокет DatagramSocket привязан к более конкретному адресу.
Пример:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
Что эквивалентно:
DatagramSocket s = new DatagramSocket(8888);
В обоих случаях будет создан сокет DatagramSocket, способный принимать широковещательные пакеты на UDP-порту 8888. Класс DatagramSocket определяет удобные методы для установки и получения нескольких параметров сокета. Этот класс также определяет методы setOption и getOption для установки и запроса параметров сокета. Сокет DatagramSocket поддерживает следующие параметры сокета:
Имя параметра Описание SO_SNDBUFРазмер буфера отправки сокета в байтах SO_RCVBUFРазмер буфера приёма сокета в байтах SO_REUSEADDRПовторное использование адреса SO_BROADCASTРазрешить передачу широковещательных пакетов данных IP_TOSОтрезок типа обслуживания (ToS) в заголовке Интернет-протокола (IP)
Кроме того, класс DatagramSocket определяет методы для присоединения и выхода из многоадресной группы и поддерживает параметры многоадресной рассылки, которые полезны при присоединении, выходе или отправке пакетов данных в многоадресную группу. Поддерживаются следующие параметры многоадресной рассылки:
Реализация также может поддерживать дополнительные параметры.
Имя параметра Описание IP_MULTICAST_IFСетевой интерфейс для пакетов данных многоадресной рассылки Интернет-протокола (IP) IP_MULTICAST_TTLВремя жизни для пакетов данных многоадресной рассылки Интернет-протокола (IP) IP_MULTICAST_LOOPВозврат для пакетов данных многоадресной рассылки Интернет-протокола (IP)
- Примечание API:
-
Многоадресная рассылка с помощью DatagramSocket
DatagramChannelреализует интерфейсMulticastChannelи предоставляет альтернативный API для отправки и получения пакетов данных многоадресной рассылки. APIMulticastChannelподдерживает как любой источник, так и конкретный источник многоадресной рассылки. Рассмотрите использованиеDatagramChannelдля многоадресной рассылки.DatagramSocketможет использоваться непосредственно для многоадресной рассылки. Однако, в отличие отMulticastSocket,DatagramSocketне вызывает методsetReuseAddress(boolean)для включения параметра сокета SO_REUSEADDR по умолчанию. Если создаётсяDatagramSocket, предназначенный для последующего присоединения к многоадресной группе, вызывающий должен рассмотреть возможность явного включения параметра SO_REUSEADDR.Экземпляр
DatagramSocketможет использоваться для отправки или получения пакетов данных многоадресной рассылки. Для отправки пакетов данных многоадресной рассылки не обязательно присоединяться к многоадресной группе. Однако перед отправкой пакетов данных многоадресной рассылки должен быть настроен интерфейс по умолчанию для отправки пакетов данных многоадресной рассылки, используяsetOptionиStandardSocketOptions.IP_MULTICAST_IF:DatagramSocket sender = new DatagramSocket(new InetSocketAddress(0)); NetworkInterface outgoingIf = NetworkInterface.getByName("en0"); sender.setOption(StandardSocketOptions.IP_MULTICAST_IF, outgoingIf); // optionally configure multicast TTL; the TTL defines the scope of a // multicast datagram, for example, confining it to host local (0) or // link local (1) etc... int ttl = ...; // a number between 0 and 255 sender.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); // send a packet to a multicast group byte[] msgBytes = ...; InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); int port = 6789; InetSocketAddress dest = new InetSocketAddress(mcastaddr, port); DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, dest); sender.send(hi);Экземпляр
DatagramSocketтакже может использоваться для получения пакетов данных многоадресной рассылки.DatagramSocket, созданный с намерением получения пакетов данных многоадресной рассылки, должен быть создан без привязки. Перед привязкой сокета необходимо настроитьsetReuseAddress(true):DatagramSocket socket = new DatagramSocket(null); // unbound socket.setReuseAddress(true); // set reuse address before binding socket.bind(new InetSocketAddress(6789)); // bind // joinGroup 228.5.6.7 InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); InetSocketAddress group = new InetSocketAddress(mcastaddr, 0); NetworkInterface netIf = NetworkInterface.getByName("en0"); socket.joinGroup(group, netIf); byte[] msgBytes = new byte[1024]; // up to 1024 bytes DatagramPacket packet = new DatagramPacket(msgBytes, msgBytes.length); socket.receive(packet); .... // eventually leave group socket.leaveGroup(group, netIf);Зависимости от платформы
Реализация многоадресной рассылки предназначена для прямого отображения на родную функцию многоадресной рассылки. Поэтому при разработке приложения, принимающего пакеты данных IP-многоадресной рассылки, следует учитывать следующие моменты:
- В отличие от
DatagramChannel, конструкторыDatagramSocketне позволяют указатьProtocolFamilyбазового сокета. В результате семейство протоколов базового сокета может не соответствовать семейству протоколов многоадресных групп, к которым будет пытаться присоединитьсяDatagramSocket.
Нет гарантии, чтоDatagramSocketс базовым сокетом, созданным в одном семействе протоколов, сможет присоединиться и принять пакеты данных многоадресной рассылки, когда адрес многоадресной группы соответствует другому семейству протоколов. Например, конкретная реализация может определить, сможет лиDatagramSocketк IPv6-сокету присоединиться к IPv4-многоадресной группе и принять пакеты данных, отправленные в эту группу. - Перед присоединением к многоадресной группе
DatagramSocketдолжен быть привязан к адресу по умолчанию. Если сокет привязан к определённому адресу, а не к адресу по умолчанию, то это зависит от реализации, будут ли пакеты данных многоадресной рассылки приняты сокетом. - Параметр SO_REUSEADDR должен быть включен до привязки сокета. Это необходимо для того, чтобы несколько членов группы могли привязаться к одному и тому же адресу.
- В отличие от
- С:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создаёт сокет дейтаграммы и связывает его с любым доступным портом на локальном хост-машине. |
||
| Создаёт сокет дейтаграммы и связывает его со специфицированным портом на локальном хост-машине. |
||
| Создаёт сокет дейтаграммы, связанный со специфицированным локальным адресом. |
||
protected |
Создаёт не связанный сокет дейтаграммы со специфицированным DatagramSocketImpl. |
|
| Создаёт сокет дейтаграммы, связанный со специфицированным локальным адресом сокета. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
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 |
joinGroup |
Присоединяется к мультикаст-группе. |
void |
leaveGroup |
Выходит из мультикаст-группы на указанном локальном интерфейсе. |
void |
receive |
Принимает пакет дейтаграммы из этого сокета. |
void |
send |
Отправляет пакет дейтаграммы из этого сокета. |
void |
setBroadcast |
Включает/выключает SO_BROADCAST. |
static void |
setDatagramSocketImplFactory |
Устарело. |
<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() |
Возвращает набор параметров сокета, поддерживаемых данным сокетом. |
Подробное описание конструкторов
DatagramSocket
public DatagramSocket() throws SocketException
wildcard адресу.- Исключения:
-
SocketException- если сокет не может быть открыт или привязан.
DatagramSocket
protected DatagramSocket(DatagramSocketImpl impl)
- Параметры:
-
impl- экземпляр DatagramSocketImpl, который подкласс желает использовать в DatagramSocket. - С версии:
- 1.4
DatagramSocket
public DatagramSocket(SocketAddress bindaddr) throws SocketException
Если адрес является null, будет создан свободный сокет.
- Параметры:
-
bindaddr- локальный адрес сокета для привязки, илиnullдля свободного сокета. - Исключения:
-
SocketException- если сокет не может быть открыт или привязан к указанному локальному порту. -
IllegalArgumentException- если bindaddr является классом SocketAddress, не поддерживаемым этим сокетом. - С версии:
- 1.4
DatagramSocket
public DatagramSocket(int port) throws SocketException
wildcard адресу.- Параметры:
-
port- локальный порт для использования в операции привязки. - Исключения:
-
SocketException- если сокет не может быть открыт или привязан к указанному локальному порту. -
IllegalArgumentException- если порт находится вне допустимого диапазона.
DatagramSocket
public DatagramSocket(int port, InetAddress laddr) throws SocketException
Локальный порт должен быть в диапазоне от 0 до 65535 включительно. Номер порта zero позволит системе выбрать свободный порт в операции bind.
Если IP-адрес является wildcard адресом или равен null, сокет будет привязан к адресу-маске.
- Параметры:
-
port- локальный порт для использования в операции привязки. -
laddr- локальный адрес для привязки (может бытьnull) - Исключения:
-
SocketException- если сокет не может быть открыт или привязан к указанному локальному порту. -
IllegalArgumentException- если порт находится вне допустимого диапазона. - С версии:
- 1.1
Подробное описание методов
bind
public void bind(SocketAddress addr) throws SocketException
Если адрес является null, то система выберет свободный порт и действительный локальный адрес для привязки сокета.
- Параметры:
-
addr- Адрес и порт для привязки. - Исключения:
-
SocketException- если происходит какая-либо ошибка во время привязки, или сокет уже привязан или закрыт. -
IllegalArgumentException- если addr является классом SocketAddress, не поддерживаемым этим сокетом. - С версии:
- 1.4
connect
public void connect(InetAddress address, int port)
Если сокет не привязан, этот метод сначала заставит сокет привязаться к автоматически назначенному адресу, как при вызове метода bind с параметром null. Если удалённый пункт назначения, к которому подключён сокет, не существует или недоступен, и если для этого адреса был получен пакет ICMP destination unreachable, то последующий вызов send или receive может вызвать исключение PortUnreachableException. Обратите внимание, нет гарантии, что исключение будет вызвано.
Если сокет уже подключён, то этот метод попытается подключиться к указанному адресу. Если это подключение завершится неудачей, состояние этого сокета неизвестно - он может или не может быть подключён к адресу, к которому он был подключён ранее.
При подключённом сокете метод send проверяет, соответствует ли адрес пакета удалённому адресу, к которому подключён сокет. Сокет, подключённый к многоадресной группе, может быть использован только для отправки пакетов. Датаграммы в буфере приёма сокета, которые не были получены до вызова этого метода, могут быть удалены.
- Параметры:
-
address- удалённый адрес для сокета -
port- удалённый порт для сокета. - Исключения:
-
IllegalArgumentException- если адрес равен null, или порт находится вне допустимого диапазона. -
UncheckedIOException- если порт равен 0 или подключение завершается неудачей, например, если адрес назначения недоступен - С версии:
- 1.2
- См. также:
connect
public void connect(SocketAddress addr) throws SocketException
Если задан InetSocketAddress, этот метод ведет себя так, как будто вызывается connect(InetAddress,int) с IP-адресом и номером порта указанных адресов сокетов, за исключением того, что SocketException, который может быть вызван, не заключён в UncheckedIOException. Датаграммы в буфере приёма сокета, которые не были получены до вызова этого метода, могут быть удалены.
Если этот сокет уже подключён, то этот метод попытается подключиться к заданному адресу. Если это подключение завершится неудачей, состояние этого сокета неизвестно - он может или не может быть подключён к адресу, к которому он был подключён ранее.
- Параметры:
-
addr- Удалённый адрес. - Исключения:
-
SocketException- если подключение завершается неудачей -
IllegalArgumentException- еслиaddrявляетсяnull, илиaddr- это подкласс SocketAddress, не поддерживаемый этим сокетом - С версии:
- 1.4
disconnect
public void disconnect()
- Примечание API:
- Если этот метод выбрасывает UncheckedIOException, сокет может остаться в неопределённом состоянии. Сильно рекомендуется закрыть сокет, когда отключение завершилось неудачей.
- Исключения:
-
UncheckedIOException- может быть выброшено, если отключение не удаётся разорвать ассоциацию и вернуть сокет в согласованное состояние. - С версии:
- 1.2
- См. также:
isBound
public boolean isBound()
Если сокет был привязан до closed, этот метод будет продолжать возвращать true после закрытия сокета.
- Возвращает:
- true, если сокет успешно привязан к адресу
- С версии:
- 1.4
isConnected
public boolean isConnected()
Если сокет был подключён до closed, этот метод будет продолжать возвращать true после закрытия сокета.
- Возвращает:
- true, если сокет успешно подключён к серверу
- С версии:
- 1.4
getInetAddress
public InetAddress getInetAddress()
null, если сокет не подключён. Если сокет был подключён до closed, этот метод будет продолжать возвращать подключённый адрес после закрытия сокета.
- Возвращает:
- адрес, к которому подключён этот сокет.
- С версии:
- 1.2
getPort
public int getPort()
-1, если сокет не подключён. Если сокет был подключён до closed, этот метод будет продолжать возвращать номер подключённого порта после закрытия сокета.
- Возвращает:
- номер порта, к которому подключён этот сокет.
- С версии:
- 1.2
getRemoteSocketAddress
public SocketAddress getRemoteSocketAddress()
null, если он не подключен. Если сокет был подключен до вызова closed, то этот метод будет продолжать возвращать подключенный адрес после закрытия сокета.
- Возвращает:
- объект
SocketAddress, представляющий удалённую конечную точку этого сокета, илиnull, если он ещё не подключен. - Since:
- 1.4
- См. также:
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
Если сокет был первоначально привязан к широковещательному адресу и теперь connected, то возвращаемый адрес может быть локальным адресом, выбранным в качестве исходного адреса для датаграмм, отправленных по этому сокету, вместо широковещательного адреса. При вызове disconnect() привязанный адрес возвращается к широковещательному.
- Возвращает:
- объект
SocketAddress, представляющий локальную конечную точку этого сокета, илиnull, если он закрыт или ещё не привязан. - Since:
- 1.4
- См. также:
send
public void send(DatagramPacket p) throws IOException
DatagramPacket содержит информацию об отправляемых данных, их длине, IP-адресе удалённого узла и номере порта на удалённом узле.- Параметры:
-
p- пакетDatagramPacketдля отправки. - Исключения:
-
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
PortUnreachableException- может быть брошен, если сокет подключен к недоступному в данный момент пункту назначения. Отметим, что нет гарантий, что исключение будет брошено. -
IllegalBlockingModeException- если у этого сокета есть связанный канал и канал находится в режиме без блокировки. -
IllegalArgumentException- если сокет подключен, и подключенный адрес и адрес пакета различаются, или если сокет не подключен, и адрес пакета не задан, или если его порт находится вне диапазона. - См. также:
receive
public void receive(DatagramPacket p) throws IOException
DatagramPacket заполняется полученными данными. Пакет датаграмм также содержит IP-адрес отправителя и номер порта на машине отправителя. Поле length объекта пакета датаграмм содержит длину полученного сообщения. Если сообщение длиннее, чем длина пакета, сообщение усекается. Этот метод может быть прерван в следующих обстоятельствах:
- Сокет датаграмм связан с
DatagramChannel. В этом случае прерывание потока, принимающего пакет датаграмм, закроет базовый канал и заставит этот метод броситьClosedByInterruptExceptionс установленным состоянием прерывания. - Сокет датаграмм использует системную реализацию сокета и виртуальный поток получает пакет датаграмм. В этом случае прерывание виртуального потока заставит его проснуться и закрыть сокет. Затем этот метод бросит
SocketExceptionс установленным состоянием прерывания.
- Параметры:
-
p- пакетDatagramPacket, в который нужно поместить входящие данные. - Исключения:
-
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
SocketTimeoutException- если ранее был вызван setSoTimeout, и таймаут истек. -
PortUnreachableException- может быть брошен, если сокет подключен к недоступному в данный момент пункту назначения. Отметим, что нет гарантий, что исключение будет брошено. -
IllegalBlockingModeException- если у этого сокета есть связанный канал и канал находится в режиме без блокировки. - См. также:
getLocalAddress
public InetAddress getLocalAddress()
Если сокет был первоначально привязан к широковещательному адресу и теперь connected, то возвращаемый адрес может быть локальным адресом, выбранным в качестве исходного адреса для датаграмм, отправленных по сокету, вместо широковещательного адреса. При вызове disconnect() привязанный адрес возвращается к широковещательному.
- Возвращает:
- локальный адрес, к которому привязан сокет,
nullесли сокет закрыт, или объектInetAddress, представляющийwildcardадрес, если сокет не привязан - Since:
- 1.1
getLocalPort
public int getLocalPort()
- Возвращает:
- номер порта на локальном узле, к которому привязан этот сокет,
-1, если сокет закрыт, или0, если он ещё не привязан.
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
- Параметры:
-
timeout- заданный таймаут в миллисекундах. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP, или сокет закрыт. -
IllegalArgumentException- еслиtimeoutотрицательное - Since:
- 1.1
- См. также:
getSoTimeout
public int getSoTimeout() throws SocketException
- Возвращает:
- значение SO_TIMEOUT
- Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP, или сокет закрыт. - Since:
- 1.1
- См. также:
setSendBufferSize
public void setSendBufferSize(int size) throws SocketException
DatagramSocket. Параметр SO_SNDBUF используется реализацией сети в качестве подсказки для размера базовых буферов ввода-вывода сети. Настройка SO_SNDBUF может также использоваться реализацией сети для определения максимального размера пакета, который может быть отправлен по этому сокету. Поскольку SO_SNDBUF является подсказкой, приложения, которые хотят проверить, какой размер имеет буфер, должны вызвать getSendBufferSize().
Увеличение размера буфера может позволить нескольким исходящим пакетам быть помещены в очередь реализацией сети при высокой скорости передачи.
Примечание: Если send(DatagramPacket) используется для отправки DatagramPacket, который больше, чем значение SO_SNDBUF, то поведение (отправка или отбрасывание пакета) зависит от реализации.
- Замечание по API:
- Если
size > 0, этот метод эквивалентен вызовуsetOption(StandardSocketOptions.SO_SNDBUF, size). - Параметры:
-
size- размер, до которого нужно установить размер буфера отправки, в байтах. Это значение должно быть больше 0. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP, или сокет закрыт. -
IllegalArgumentException- если значение равно 0 или отрицательно. - Since:
- 1.2
- См. также:
getSendBufferSize
public int getSendBufferSize() throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_SNDBUF). - Возвращает:
- значение параметра SO_SNDBUF для этого сокета
- Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. - С:
- 1.2
- См. также:
setReceiveBufferSize
public void setReceiveBufferSize(int size) throws SocketException
Так как SO_RCVBUF является подсказкой, приложения, которые хотят проверить, какой размер буфера был установлен, должны вызвать getReceiveBufferSize().
Увеличение значения SO_RCVBUF может позволить сетевой реализации буферизовать несколько пакетов, когда пакеты прибывают быстрее, чем обрабатываются с помощью receive(DatagramPacket).
Примечание: Если пакет больше, чем SO_RCVBUF, то его прием зависит от реализации.
- Примечание API:
- Если
size > 0, этот метод эквивалентен вызовуsetOption(StandardSocketOptions.SO_RCVBUF, size). - Параметры:
-
size- размер, в байтах, на который нужно установить размер буфера приема. Это значение должно быть больше 0. - Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. -
IllegalArgumentException- если значение равно 0 или отрицательно. - С:
- 1.2
- См. также:
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_RCVBUF). - Возвращает:
- значение параметра SO_RCVBUF для этого сокета
- Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. - С:
- 1.2
- См. также:
setReuseAddress
public void setReuseAddress(boolean on) throws SocketException
Для UDP-сокетa может потребоваться привязать несколько сокетов к одному адресу. Это обычно необходимо для приема мультивещательных пакетов (см. MulticastSocket). Параметр SO_REUSEADDR позволяет привязать несколько сокетов к одному адресу, если параметр SO_REUSEADDR включён до привязки сокета с помощью bind(SocketAddress).
Примечание: Эта функциональность не поддерживается всеми платформами, поэтому поведение зависит от реализации. Однако, если она не поддерживается, то getReuseAddress() всегда вернёт false.
При создании сокета SO_REUSEADDR по умолчанию отключён.
Поведение при включении или отключении SO_REUSEADDR после привязки сокета (см. isBound()) не определено.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_REUSEADDR, on). - Параметры:
-
on- включить или выключить - Исключения:
-
SocketException- если произошла ошибка при включении или отключении параметра SO_REUSEADDR, или сокет закрыт. - С:
- 1.4
- См. также:
getReuseAddress
public boolean getReuseAddress() throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_REUSEADDR). - Возвращает:
- значение, указывающее, включен ли SO_REUSEADDR.
- Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. - С:
- 1.4
- См. также:
setBroadcast
public void setBroadcast(boolean on) throws SocketException
Некоторые операционные системы могут потребовать запуска Java виртуальной машины с определёнными привилегиями, чтобы включить этот параметр или отправить пакеты широковещательной рассылки.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_BROADCAST, on). - Параметры:
-
on- включить или выключить широковещательный режим. - Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. - С:
- 1.4
- См. также:
getBroadcast
public boolean getBroadcast() throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_BROADCAST). - Возвращает:
- значение, указывающее, включен ли SO_BROADCAST.
- Исключения:
-
SocketException- если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт. - С:
- 1.4
- См. также:
setTrafficClass
public void setTrafficClass(int tc) throws SocketException
Значение tc должно быть в диапазоне 0 <= tc <=
255, в противном случае будет брошено исключение IllegalArgumentException.
Примечания:
Для Internet Protocol v4 значение состоит из integer, наименее значимые 8 бит которого представляют значение байта TOS в IP-пакетах, отправленных сокетом. RFC 1349 определяет значения TOS следующим образом:
IPTOS_LOWCOST (0x02)IPTOS_RELIABILITY (0x04)IPTOS_THROUGHPUT (0x08)IPTOS_LOWDELAY (0x10)
Установка битов в поле приоритета может привести к SocketException, указывающему на то, что операция запрещена.
Для Internet Protocol v6 значение tc является значением, которое будет помещено в поле sin6_flowinfo заголовка IP.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_TOS, tc). - Параметры:
-
tc- значение для битовой комбинации. - Исключения:
-
SocketException- если произошла ошибка при установке класса трафика или типа сервиса, или сокет закрыт. - С:
- 1.4
- См. также:
getTrafficClass
public int getTrafficClass() throws SocketException
Поскольку реализация сетевого уровня может игнорировать класс трафика или тип обслуживания, заданный с помощью setTrafficClass(int), этот метод может вернуть значение, отличное от того, что было ранее задано с помощью метода setTrafficClass(int) для этого объекта DatagramSocket.
- API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_TOS). - Возвращает:
- уже установленный класс трафика или тип обслуживания
- Исключение:
-
SocketException- если возникла ошибка при получении значения класса трафика или типа обслуживания, или сокет закрыт. - С:
- 1.4
- См. также:
close
public void close()
Любой поток, в настоящее время заблокированный в методе receive(java.net.DatagramPacket) для этого сокета, выбросит исключение SocketException.
Если у этого сокета есть связанный канал, то канал также закрывается.
После закрытия несколько методов, определенных в этом классе, выбросят исключение, если будут вызваны для закрытого сокета.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable
isClosed
public boolean isClosed()
- Возвращает:
- true, если сокет закрыт
- С:
- 1.4
getChannel
public DatagramChannel getChannel()
DatagramChannel, связанный с этим сокетом датаграммы, если таковой имеется. У сокета датаграммы будет канал, если и только если сам канал был создан с помощью метода DatagramChannel.open.
- Возвращает:
- канал датаграммы, связанный с этим сокетом датаграммы, или
null, если этот сокет не был создан для канала - С:
- 1.4
setDatagramSocketImplFactory
@Deprecated(since="17") public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
DatagramChannel, или подклассы DatagramSocket непосредственно. Этот метод предоставлял способ в ранних релизах JDK заменить системную реализацию
DatagramSocket. Он в основном устарел с Java 1.4. Если требуется, можно создать DatagramSocket, чтобы использовать пользовательскую реализацию, расширив DatagramSocket и используя защищенный конструктор, принимающий реализацию в качестве параметра. Когда приложение создает новый сокет датаграммы, вызывается метод createDatagramSocketImpl фабрики реализации сокета, чтобы создать фактическую реализацию сокета датаграммы.
Передача null методу - это действие без последствий, если фабрика еще не была установлена.
- Параметры:
-
fac- требуемая фабрика. - Исключение:
-
IOException- если при установке фабрики сокета датаграммы произошла ошибка ввода/вывода. -
SocketException- если фабрика уже определена. - С:
- 1.3
- См. также:
setOption
public <T> DatagramSocket setOption(SocketOption<T> name, T value) throws IOException
- Типы параметров:
T- Тип значения параметра сокета- Параметры:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров. - Возвращает:
- этот объект DatagramSocket
- Исключение:
-
UnsupportedOperationException- если сокет датаграммы не поддерживает параметр. -
IllegalArgumentException- если значение не является допустимым для параметра. -
IOException- если произошла ошибка ввода/вывода, или сокет закрыт. -
NullPointerException- если имя являетсяnull - С:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Типы параметров:
T- Тип значения параметра сокета- Параметры:
-
name- Параметр сокета - Возвращает:
- Значение параметра сокета.
- Исключение:
-
UnsupportedOperationException- если сокет датаграммы не поддерживает параметр. -
IOException- если произошла ошибка ввода/вывода, или сокет закрыт. -
NullPointerException- если имя являетсяnull - С:
- 9
supportedOptions
public Set<SocketOption<?>> supportedOptions()
- Возвращает:
- Набор параметров сокета, поддерживаемых этим сокетом. Этот набор может быть пустым, если DatagramSocketImpl сокета не может быть создан.
- С:
- 9
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Чтобы присоединиться к группе мультикаста, вызывающий должен указать IP-адрес группы мультикаста для присоединения и локальный сетевой интерфейс для приема пакетов мультикаста.
- Аргумент
mcastaddrуказывает IP-адрес группы мультикаста для присоединения. По историческим причинам он указан какSocketAddress. Реализация по умолчанию поддерживает толькоInetSocketAddress, и информацияportигнорируется. - Аргумент
netIfуказывает локальный интерфейс для приема пакетов датаграмм мультикаста, илиnullдля откладывания на интерфейс, установленный для исходящих датаграмм мультикаста. Еслиnull, и не установлен ни один интерфейс, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкой сSocketException.
Можно вызывать этот метод несколько раз, чтобы присоединиться к нескольким различным группам мультикаста или присоединиться к одной и той же группе в нескольких различных сетях. Однако, если сокет уже является членом группы, будет брошено исключение IOException.
- API Note:
- По умолчанию интерфейс для отправки исходящих датаграмм мультикаста можно настроить с помощью
setOption(SocketOption, Object)сStandardSocketOptions.IP_MULTICAST_IF. - Параметры:
-
mcastaddr- указывает адрес мультикаста для присоединения. -
netIf- указывает локальный интерфейс для приема пакетов датаграмм мультикаста, илиnull. - Исключение:
-
IOException- если произошла ошибка при присоединении, или адрес не является адресом мультикаста, или платформа не поддерживает мультикаст, или сокет закрыт -
IllegalArgumentException- если mcastaddr являетсяnullили является подклассом SocketAddress, не поддерживаемым этим сокетом - С:
- 17
- См. также:
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
- Примечание API:
- Аргументы
mcastaddrиnetIfдолжны указывать на мультикастовую группу, которая была ранее присоединена этимDatagramSocket.Возможен многократный вызов данного метода для выхода из нескольких различных мультикастовых групп, которые ранее были подключены, или выхода из той же группы, подключённой в нескольких разных сетях. Однако, если сокет не является членом указанной группы в указанной сети, будет брошено исключение
IOException. - Параметры:
-
mcastaddr- мультикастовый адрес для выхода. Он должен содержать тот же IP-адрес, что и используемый для подключения к группе. -
netIf- определяет локальный интерфейс илиnullдля обратной ссылки на интерфейс, установленный для исходящих мультикастовых датаграмм. Еслиnullи не был установлен никакой интерфейс, поведение не определено: может быть выбран любой интерфейс или операция может завершиться с ошибкойSocketException. - Исключения:
-
IOException- если произошла ошибка при выходе или если адрес не является мультикастовым адресом или сокет закрыт. -
IllegalArgumentException- если mcastaddr являетсяnullили является подклассом SocketAddress, не поддерживаемым данным сокетом. - С тех пор:
- 17
- См. также:
© 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/DatagramSocket.html
DatagramChannel, или наследуйте отDatagramSocketнапрямую.