Класс 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 о недоступности назначения, последующий вызов 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, если подключение еще не установлено. - С версии:
- 1.4
- См. также:
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
Если сокет изначально был привязан к адресу-шаблону и теперь connected, возвращаемым адресом может быть локальный адрес, выбранный в качестве исходного адреса для отправляемых этим сокетом дейтаграмм, а не адрес-шаблон. При вызове disconnect() привязанный адрес возвращается к адресу-шаблону.
- Возвращает:
- объект
SocketAddress, представляющий локальную конечную точку этого сокета, илиnull, если сокет закрыт или еще не привязан. - С версии:
- 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, если сокет не привязан - С версии:
- 1.1
getLocalPort
public int getLocalPort()
- Возвращает:
- номер порта на локальном компьютере, к которому привязан этот сокет;
-1, если сокет закрыт; или0, если он еще не привязан.
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
- Параметры:
-
timeout— указанное время ожидания в миллисекундах. - Исключения:
-
SocketException— если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт. -
IllegalArgumentException— еслиtimeoutотрицательно - С версии:
- 1.1
- См. также:
getSoTimeout
public int getSoTimeout() throws SocketException
- Возвращает:
- значение параметра SO_TIMEOUT
- Исключения:
-
SocketException— если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт. - С версии:
- 1.1
- См. также:
setSendBufferSize
public void setSendBufferSize(int size) throws SocketException
DatagramSocket. Параметр SO_SNDBUF используется сетевой реализацией как рекомендация по размеру базовых буферов сетевого ввода-вывода. Сетевая реализация также может использовать значение SO_SNDBUF для определения максимального размера пакета, который можно отправить через этот сокет. Поскольку SO_SNDBUF является рекомендацией, приложениям, которым нужно проверить размер буфера, следует вызвать getSendBufferSize().
Увеличение размера буфера может позволить сетевой реализации поставить в очередь несколько исходящих пакетов при высокой скорости отправки.
Примечание: если для отправки DatagramPacket, размер которого превышает значение SO_SNDBUF, используется send(DatagramPacket), будет ли пакет отправлен или отброшен, зависит от реализации.
- Примечание к API:
- Если
size > 0, этот метод эквивалентен вызовуsetOption(StandardSocketOptions.SO_SNDBUF, size). - Параметры:
-
size— размер буфера отправки в байтах. Значение должно быть больше 0. - Исключения:
-
SocketException— если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт. -
IllegalArgumentException— если значение равно 0 или отрицательно. - С версии:
- 1.2
- См. также:
getSendBufferSize
public int getSendBufferSize() throws SocketException
DatagramSocket, то есть размер буфера в байтах, используемого платформой для вывода через этот DatagramSocket.- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_SNDBUF). - Возвращает:
- значение параметра SO_SNDBUF для этого
DatagramSocket - Исключения:
-
SocketException— если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт. - С версии:
- 1.2
- См. также:
setReceiveBufferSize
public void setReceiveBufferSize(int size) throws SocketException
DatagramSocket. Параметр SO_RCVBUF используется сетевой реализацией как рекомендация по размеру базовых буферов сетевого ввода-вывода. Сетевая реализация также может использовать значение SO_RCVBUF для определения максимального размера пакета, который можно получить через этот сокет. Поскольку 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
DatagramSocket, то есть размер буфера в байтах, используемого платформой для ввода через этот DatagramSocket.- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_RCVBUF). - Возвращает:
- значение параметра SO_RCVBUF для этого
DatagramSocket - Исключения:
-
SocketException— если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт. - С версии:
- 1.2
- См. также:
setReuseAddress
public void setReuseAddress(boolean on) throws SocketException
Для сокетов UDP может потребоваться привязать несколько сокетов к одному адресу сокета. Обычно это делается для получения многоадресных пакетов (см. MulticastSocket). Параметр сокета SO_REUSEADDR позволяет привязать несколько сокетов к одному адресу сокета, если параметр сокета SO_REUSEADDR включен до привязки сокета с помощью bind(SocketAddress).
Примечание: эта функциональность поддерживается не всеми существующими платформами, поэтому то, будет ли этот параметр игнорироваться, зависит от реализации. Однако, если он не поддерживается, getReuseAddress() всегда будет возвращать false.
При создании DatagramSocket параметр 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). - Возвращает:
- значение
boolean, указывающее, включен ли 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). - Возвращает:
- значение
boolean, указывающее, включен ли 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— значениеintдля битового набора. - Исключения:
-
SocketException— если произошла ошибка при установке класса трафика или типа обслуживания либо если сокет закрыт. - С версии:
- 1.4
- См. также:
getTrafficClass
public int getTrafficClass() throws SocketException
Поскольку нижележащая сетевая реализация может игнорировать класс трафика или тип обслуживания, заданные с помощью setTrafficClass(int), этот метод может вернуть значение, отличное от значения, ранее заданного с помощью метода setTrafficClass(int) для этого DatagramSocket.
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_TOS). - Возвращает:
- ранее заданный класс трафика или тип обслуживания
- Исключения:
-
SocketException— если произошла ошибка при получении значения класса трафика или типа обслуживания либо если сокет закрыт. - С версии:
- 1.4
- См. также:
close
public void close()
Любой поток, в данный момент заблокированный в вызове receive(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— если name равноnull - С версии:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Параметры типа:
T— тип значения параметра сокета- Параметры:
-
name— параметр сокета - Возвращает:
- значение параметра сокета.
- Исключения:
-
UnsupportedOperationException— если дейтаграммный сокет не поддерживает этот параметр. -
IOException— если произошла ошибка ввода-вывода или сокет закрыт. -
NullPointerException— если name равно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:
- Интерфейс по умолчанию для отправки исходящих дейтаграмм многоадресной рассылки можно настроить с помощью
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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/net/DatagramSocket.html
DatagramChannelили напрямую создайте подклассDatagramSocket.