Класс 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. Если установлен менеджер безопасности, его метод checkListen вызывается с аргументом 0, чтобы убедиться, что операция разрешена. Это может привести к исключению SecurityException.
- Исключения:
-
SocketException- если сокет не удалось открыть или привязать. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. - См. также:
DatagramSocket
protected DatagramSocket(DatagramSocketImpl impl)
- Параметры:
-
impl- экземпляр DatagramSocketImpl, который подкласс хочет использовать в DatagramSocket. - С тех пор:
- 1.4
DatagramSocket
public DatagramSocket(SocketAddress bindaddr) throws SocketException
Если адрес null, будет создан несвязанный сокет.
Если установлен менеджер безопасности, его метод checkListen вызывается с портом из адреса сокета в качестве аргумента, чтобы убедиться, что операция разрешена. Это может привести к исключению SecurityException.
- Параметры:
-
bindaddr- локальный адрес сокета для привязки, илиnullдля несвязанного сокета. - Исключения:
-
SocketException- если сокет не удалось открыть или привязать к указанному локальному порту. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если bindaddr является подклассом SocketAddress, не поддерживаемым этим сокетом. - С тех пор:
- 1.4
- См. также:
DatagramSocket
public DatagramSocket(int port) throws SocketException
wildcard. Если установлен менеджер безопасности, его метод checkListen вызывается с аргументом port в качестве аргумента, чтобы убедиться, что операция разрешена. Это может привести к исключению SecurityException.
- Параметры:
-
port- локальный порт для использования в операции привязки. - Исключения:
-
SocketException- если сокет не удалось открыть или привязать к указанному локальному порту. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если порт находится вне диапазона . - См. также:
DatagramSocket
public DatagramSocket(int port, InetAddress laddr) throws SocketException
Локальный порт должен быть в диапазоне от 0 до 65535 включительно. Номер порта zero позволит системе выбрать временный порт в bind операции.
Если IP-адрес является wildcard адресом или является null, сокет будет привязан к адресному маске.
Если установлен менеджер безопасности, его метод checkListen вызывается с аргументом port в качестве аргумента, чтобы убедиться, что операция разрешена. Это может привести к исключению SecurityException.
- Параметры:
-
port- локальный порт для использования в операции привязки. -
laddr- локальный адрес для привязки (может бытьnull). - Исключения:
-
SocketException- если сокет не удалось открыть или привязать к указанному локальному порту. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если порт находится вне диапазона . - С тех пор:
- 1.1
- См. также:
Подробное описание методов
bind
public void bind(SocketAddress addr) throws SocketException
Если адрес null, система выберет временный порт и действительный локальный адрес для привязки сокета.
- Параметры:
-
addr- Адрес и порт для привязки. - Исключения:
-
SocketException- если произошла ошибка во время привязки или если сокет уже привязан. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если addr является подклассом SocketAddress, не поддерживаемым этим сокетом. - С тех пор:
- 1.4
connect
public void connect(InetAddress address, int port)
Если этот сокет не привязан, то этот метод сначала заставит сокет привязаться к адресу, который назначается автоматически, как если бы вызывался метод bind с параметром null. Если удалённый пункт назначения, к которому подключён сокет, не существует или недоступен, и если для этого адреса был получен пакет ICMP с сообщением о недоступности пункта назначения, то последующий вызов send или receive может бросить исключение PortUnreachableException. Заметьте, нет никакой гарантии, что исключение будет брошено.
Если менеджер безопасности установлен, то он вызывается для проверки доступа к удалённому адресу. Конкретно, если заданный address является multicast address, вызывается метод менеджера безопасности checkMulticast с заданным address. В противном случае вызываются методы менеджера безопасности checkConnect и checkAccept с заданными address и port, чтобы проверить, разрешено ли отправлять и получать пакеты соответственно.
Следует позаботиться о том, чтобы подключённый сокет Datagram не использовался небезопасным кодом. Когда сокет подключён, receive и send не будут выполнять никаких проверок безопасности на входящих и исходящих пакетах, кроме сопоставления адреса и порта пакета и сокета. При операции отправки, если адрес пакета задан и адрес пакета и адрес сокета не совпадают, будет выброшено исключение IllegalArgumentException. Сокет, подключенный к многоадресной группе, может использоваться только для отправки пакетов. Датаграммы в буфере приема сокета ., которые не были приняты до вызова этого метода, могут быть удалены.
- Параметры:
-
address- удалённый адрес для сокета -
port- удалённый порт для сокета. - Исключения:
-
IllegalArgumentException- если адрес равен null, или порт находится вне диапазона . -
SecurityException- если менеджер безопасности установлен и он не разрешает доступ к указанному удалённому адресу -
UncheckedIOException- может быть выброшен, если подключение не удалось, например, если адрес назначения не маршрутизируется - С тех пор:
- 1.2
- См. также:
connect
public void connect(SocketAddress addr) throws SocketException
Если предоставлен InetSocketAddress, этот метод ведёт себя так, как будто он вызывает connect(InetAddress,int) с IP-адресом и номером порта указанных адресов сокетов, за исключением того, что SocketException, который может быть поднят, не заключён в UncheckedIOException. Датаграммы в буфере приёма сокета ., которые не были приняты перед вызовом этого метода, могут быть удалены.
- Параметры:
-
addr- удалённый адрес. - Исключения:
-
SocketException- если подключение не удалось -
IllegalArgumentException- еслиaddrявляетсяnull, илиaddrявляется подклассом SocketAddress, не поддерживаемым этим сокетом -
SecurityException- если менеджер безопасности установлен и он не разрешает доступ к данному удалённому адресу - С тех пор:
- 1.4
disconnect
public void disconnect()
- API Note:
- Если этот метод выбрасывает UncheckedIOException, сокет может остаться в неопределённом состоянии. Сильно рекомендуется закрыть сокет при неудачном отключении.
- Throws:
-
UncheckedIOException- может быть выброшено, если отключение не удалось разорвать связь и восстановить сокет в согласованном состоянии. - Since:
- 1.2
- See Also:
isBound
public boolean isBound()
Если сокет был привязан до его closed, то этот метод будет продолжать возвращать true после закрытия сокета.
- Returns:
- true, если сокет успешно привязан к адресу
- Since:
- 1.4
isConnected
public boolean isConnected()
Если сокет был подключён до его closed, то этот метод будет продолжать возвращать true после закрытия сокета.
- Returns:
- true, если сокет успешно подключён к серверу
- Since:
- 1.4
getInetAddress
public InetAddress getInetAddress()
null если сокет не подключён. Если сокет был подключён до его closed, то этот метод будет продолжать возвращать подключённый адрес после закрытия сокета.
- Returns:
- адрес, к которому подключён этот сокет.
- Since:
- 1.2
getPort
public int getPort()
-1 если сокет не подключён. Если сокет был подключён до его closed, то этот метод будет продолжать возвращать номер подключённого порта после закрытия сокета.
- Returns:
- номер порта, к которому подключён этот сокет.
- Since:
- 1.2
getRemoteSocketAddress
public SocketAddress getRemoteSocketAddress()
null если он не подключён. Если сокет был подключён до его closed, то этот метод будет продолжать возвращать подключённый адрес после закрытия сокета.
- Returns:
- объект
SocketAddressпредставляющий удалённую конечную точку этого сокета, илиnullесли он ещё не подключён. - Since:
- 1.4
- See Also:
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
- Returns:
- объект
SocketAddressпредставляющий локальную конечную точку этого сокета, илиnullесли он закрыт или ещё не привязан. - Since:
- 1.4
- See Also:
send
public void send(DatagramPacket p) throws IOException
DatagramPacket содержит информацию об отправляемых данных, их длине, IP-адресе удалённого хоста и номере порта на удалённом хосте. Если существует менеджер безопасности, и сокет в данный момент не подключён к удалённому адресу, этот метод сначала выполняет некоторые проверки безопасности. Во-первых, если p.getAddress().isMulticastAddress() равно true, этот метод вызывает метод checkMulticast менеджера безопасности с p.getAddress() в качестве аргумента. Если результат этой проверки ложный, этот метод вместо этого вызывает метод checkConnect менеджера безопасности с аргументами p.getAddress().getHostAddress() и p.getPort(). Каждый вызов метода менеджера безопасности может привести к SecurityException, если операция не разрешена.
- Parameters:
-
p- отправляемыйDatagramPacket. - Throws:
-
IOException- если произошла ошибка ввода-вывода. -
SecurityException- если существует менеджер безопасности и его методcheckMulticastилиcheckConnectне разрешают отправку. -
PortUnreachableException- может быть выброшено, если сокет подключён к в настоящее время недоступному пункту назначения. Обратите внимание, что нет гарантии, что исключение будет выброшено. -
IllegalBlockingModeException- если у этого сокета есть связанный канал, и канал находится в режиме без блокировки. -
IllegalArgumentException- если сокет подключён, и подключённый адрес и адрес пакета отличаются, или если сокет не подключён, и адрес пакета не задан, или его порт находится вне диапазона. - See Also:
receive
public void receive(DatagramPacket p) throws IOException
DatagramPacket заполняется полученными данными. Пакет datagram также содержит IP-адрес отправителя и номер порта на машине отправителя. Поле length объекта пакета datagram содержит длину принятого сообщения. Если сообщение длиннее, чем длина пакета, сообщение усекается. Этот метод прерываем в следующих случаях:
- Сокет datagram связан с
DatagramChannel. В этом случае прерывание потока, принимающего пакет datagram, закроет базовый канал и заставит этот метод выброситьClosedByInterruptExceptionсо статусом прерывания. - Сокет datagram использует реализацию сокета по умолчанию и виртуальный поток принимает пакет datagram. В этом случае прерывание виртуального потока заставит его проснуться и закрыть сокет. Затем этот метод выбросит
SocketExceptionсо статусом прерывания.
Если существует менеджер безопасности и сокет в данный момент не подключён к удалённому адресу, пакет не может быть принят, если метод checkAccept менеджера безопасности не разрешает это. Пакеты, не разрешённые менеджером безопасности, молча игнорируются.
- Parameters:
-
p-DatagramPacketдля размещения входящих данных. - Throws:
-
IOException- если произошла ошибка ввода-вывода. -
SocketTimeoutException- если ранее был вызван setSoTimeout и истек таймаут. -
PortUnreachableException- может быть выброшено, если сокет подключён к в настоящее время недоступному пункту назначения. Обратите внимание, что нет гарантии, что исключение будет выброшено. -
IllegalBlockingModeException- если у этого сокета есть связанный канал, и канал находится в режиме без блокировки. - See Also:
getLocalAddress
public InetAddress getLocalAddress()
Если существует менеджер безопасности, его метод checkConnect вызывается в первую очередь с адресом хоста и -1 в качестве аргументов, чтобы определить, разрешена ли операция.
- Returns:
- локальный адрес, к которому привязан сокет,
nullесли сокет закрыт, илиInetAddressпредставляющийwildcardадрес, если сокет не привязан или методcheckConnectменеджера безопасности не разрешает операцию - Since:
- 1.1
- See Also:
getLocalPort
public int getLocalPort()
- Returns:
- номер порта на локальном хосте, к которому привязан этот сокет,
-1если сокет закрыт, или0если он ещё не привязан.
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
- Parameters:
-
timeout- указанный тайм-аут в миллисекундах. - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. -
IllegalArgumentException- еслиtimeoutотрицательно - Since:
- 1.1
- See Also:
getSoTimeout
public int getSoTimeout() throws SocketException
- Returns:
- значение параметра SO_TIMEOUT
- Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. - Since:
- 1.1
- See Also:
setSendBufferSize
public void setSendBufferSize(int size) throws SocketException
DatagramSocket. Параметр SO_SNDBUF используется сетевой реализацией в качестве подсказки для размера подлежащих сетевых буферов ввода-вывода. Настройка SO_SNDBUF также может использоваться сетевой реализацией для определения максимального размера пакета, который может быть отправлен по этому сокету. Поскольку SO_SNDBUF является подсказкой, приложения, которые хотят проверить размер буфера, должны вызвать getSendBufferSize().
Увеличение размера буфера может позволить несколько исходящих пакетов быть помещёнными в очередь сетевой реализацией, когда скорость отправки высока.
Примечание: Если send(DatagramPacket) используется для отправки DatagramPacket, размер которого превышает значение SO_SNDBUF, то поведение отправки пакета или его отбрасывания зависит от реализации.
- API Note:
- Если
size > 0, этот метод эквивалентен вызовуsetOption(StandardSocketOptions.SO_SNDBUF, size). - Parameters:
-
size- размер, на который необходимо установить размер буфера отправки в байтах. Это значение должно быть больше 0. - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. -
IllegalArgumentException- если значение равно 0 или отрицательно. - Since:
- 1.2
- See Also:
getSendBufferSize
public int getSendBufferSize() throws SocketException
DatagramSocket, то есть размера буфера в байтах, используемого платформой для вывода в этом DatagramSocket. - API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_SNDBUF). - Returns:
- значение параметра SO_SNDBUF для данного
DatagramSocket - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. - Since:
- 1.2
- See Also:
setReceiveBufferSize
public void setReceiveBufferSize(int size) throws SocketException
DatagramSocket. Параметр SO_RCVBUF используется сетевой реализацией в качестве подсказки для размера подлежащих сетевых буферов ввода-вывода. Настройка SO_RCVBUF также может использоваться сетевой реализацией для определения максимального размера пакета, который может быть получен по этому сокету. Поскольку SO_RCVBUF является подсказкой, приложения, которые хотят проверить установленный размер буферов, должны вызвать getReceiveBufferSize().
Увеличение SO_RCVBUF может позволить сетевой реализации буферизовать несколько пакетов, когда пакеты поступают быстрее, чем они принимаются с помощью receive(DatagramPacket).
Примечание: поведение при получении пакета, размер которого больше SO_RCVBUF, зависит от реализации.
- API Note:
- Если
size > 0, этот метод эквивалентен вызовуsetOption(StandardSocketOptions.SO_RCVBUF, size). - Parameters:
-
size- размер, на который необходимо установить размер буфера приёма в байтах. Это значение должно быть больше 0. - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. -
IllegalArgumentException- если значение равно 0 или отрицательно. - Since:
- 1.2
- See Also:
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
DatagramSocket, то есть размера буфера в байтах, используемого платформой для ввода в этот DatagramSocket.- API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_RCVBUF). - Returns:
- значение параметра SO_RCVBUF для данного
DatagramSocket - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. - Since:
- 1.2
- See Also:
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 Note:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_REUSEADDR, on). - Parameters:
-
on- включить или отключить - Throws:
-
SocketException- если при включении или отключении параметра сокетаSO_REUSEADDRвозникла ошибка, или сокет закрыт. - Since:
- 1.4
- See Also:
getReuseAddress
public boolean getReuseAddress() throws SocketException
- API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_REUSEADDR). - Returns:
- значение
boolean, указывающее, включён ли SO_REUSEADDR. - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. - Since:
- 1.4
- See Also:
setBroadcast
public void setBroadcast(boolean on) throws SocketException
Некоторые операционные системы могут потребовать, чтобы виртуальная машина Java запускалась с реализационно-зависимыми привилегиями для включения этого параметра или отправки широковещательных датаграмм.
- API Note:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_BROADCAST, on). - Parameters:
-
on- включить или выключить широковещательный режим. - Throws:
-
SocketException- если возникла ошибка в базовом протоколе, например, ошибка UDP. - Since:
- 1.4
- See Also:
getBroadcast
public boolean getBroadcast() throws SocketException
- API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_BROADCAST). - Возвращает:
- значение
boolean, указывающее, включен ли SO_BROADCAST. - Издает:
-
SocketException- если в базовом протоколе возникла ошибка, например, ошибка UDP. - Since:
- 1.4
- См. также:
setTrafficClass
public void setTrafficClass(int tc) throws SocketException
Значение tc должно находиться в диапазоне 0 <= tc <=
255 или будет выброшено исключение IllegalArgumentException.
Примечания:
Для Интернет-протокола версии 4 значение состоит из integer, наименее значимые 8 битов которого представляют значение байта TOS в IP-пакетах, отправленных сокетом. RFC 1349 определяет значения TOS следующим образом:
IPTOS_LOWCOST (0x02)IPTOS_RELIABILITY (0x04)IPTOS_THROUGHPUT (0x08)IPTOS_LOWDELAY (0x10)
Установка битов в поле приоритета может привести к SocketException, указывающему, что операция запрещена.
Для Интернет-протокола версии 6 tc — это значение, которое будет помещено в поле sin6_flowinfo заголовка IP.
- API Note:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_TOS, tc). - Параметры:
-
tc- значениеintдля битовой комбинации. - Издает:
-
SocketException- если при установке класса трафика или типа обслуживания возникла ошибка. - Since:
- 1.4
- См. также:
getTrafficClass
public int getTrafficClass() throws SocketException
Поскольку базовая реализация сети может игнорировать класс трафика или тип обслуживания, установленный с помощью setTrafficClass(int), этот метод может вернуть значение, отличное от ранее установленного с помощью метода setTrafficClass(int) в этом DatagramSocket.
- API Note:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_TOS). - Возвращает:
- установленный класс трафика или тип обслуживания
- Издает:
-
SocketException- если при получении значения класса трафика или типа обслуживания возникла ошибка. - Since:
- 1.4
- См. также:
close
public void close()
Любой поток, в настоящее время заблокированный в receive(java.net.DatagramPacket) на этом сокете, выбросит SocketException.
Если у этого сокета есть связанный канал, то канал также закрывается.
- Specified by:
-
closeв интерфейсеAutoCloseable - Specified by:
-
closeв интерфейсеCloseable
isClosed
public boolean isClosed()
- Возвращает:
- true, если сокет закрыт
- Since:
- 1.4
getChannel
public DatagramChannel getChannel()
DatagramChannel, связанный с этим сокетом датаграмм, если таковой имеется. Сокет датаграмм будет иметь канал только в том случае, если сам канал был создан с помощью метода DatagramChannel.open.
- Возвращает:
- канал датаграмм, связанный с этим сокетом датаграмм, или
null, если этот сокет не был создан для канала - Since:
- 1.4
setDatagramSocketImplFactory
@Deprecated(since="17") public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
DatagramChannel или непосредственно подкласс DatagramSocket. Этот метод в ранних версиях JDK предоставлял способ заменить системную реализацию
DatagramSocket. С Java 1.4 он в основном устарел. Если требуется, можно создать DatagramSocket для использования пользовательской реализации, расширив DatagramSocket и используя защищенный конструктор, принимающий реализацию createDatagramSocketImpl в качестве параметра. При создании новым приложением нового сокета датаграмм вызывается метод createDatagramSocketImpl фабрики реализации сокета для создания фактической реализации сокета датаграмм.
Передача null в метод является бесполезной операцией, если фабрика уже не установлена.
Если установлен менеджер безопасности, этот метод сначала вызывает метод checkSetFactory менеджера безопасности, чтобы убедиться, что операция разрешена. Это может привести к SecurityException.
- Параметры:
-
fac- желаемая фабрика. - Издает:
-
IOException- если при установке фабрики сокета датаграмм произошла ошибка ввода-вывода. -
SocketException- если фабрика уже определена. -
SecurityException- если менеджер безопасности существует и его методcheckSetFactoryне разрешает операцию. - Since:
- 1.3
- См. также:
setOption
public <T> DatagramSocket setOption(SocketOption<T> name, T value) throws IOException
- Type Parameters:
-
T- Тип значения параметра сокета - Parameters:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров. - Возвращает:
- this DatagramSocket
- Издает:
-
UnsupportedOperationException- если сокет датаграмм не поддерживает параметр. -
IllegalArgumentException- если значение не является допустимым для параметра. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
SecurityException- если установлен менеджер безопасности, если параметр сокета требует разрешения безопасности, и если у вызывающего объекта нет необходимого разрешения.StandardSocketOptionsне требуют никакого разрешения безопасности. -
NullPointerException- если имяnull - Since:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Type Parameters:
-
T- Тип значения параметра сокета - Parameters:
-
name- Параметр сокета - Возвращает:
- Значение параметра сокета.
- Издает:
-
UnsupportedOperationException- если сокет датаграмм не поддерживает параметр. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имяnull -
SecurityException- если установлен менеджер безопасности, если параметр сокета требует разрешения безопасности, и если у вызывающего объекта нет необходимого разрешения.StandardSocketOptionsне требуют никакого разрешения безопасности. - Since:
- 9
supportedOptions
public Set<SocketOption<?>> supportedOptions()
- Возвращает:
- Набор поддерживаемых параметром сокета. Этот набор может быть пустым, если реализация DatagramSocketImpl сокета создать нельзя.
- Since:
- 9
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Для присоединения к группе мультимедиа вызывающий должен указать IP-адрес группы мультимедиа и локальный сетевой интерфейс для получения пакетов мультимедиа.
- Аргумент
mcastaddrуказывает IP-адрес группы мультимедиа для присоединения. По историческим причинам он задаётся какSocketAddress. Реализация по умолчанию поддерживает толькоInetSocketAddress, и информация о портеportигнорируется. - Аргумент
netIfзадаёт локальный интерфейс для получения пакетов мультимедиа-датаграмм, илиnullдля использования интерфейса, заданного для исходящих пакетов мультимедиа-датаграмм. Еслиnull, и интерфейс не задан, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкойSocketException.
Этот метод можно вызвать несколько раз, чтобы присоединиться к нескольким различным группам мультимедиа или к одной и той же группе в разных сетях. Однако, если сокет уже является членом группы, будет брошено исключение IOException.
Если существует менеджер безопасности, этот метод сначала вызывает свой метод checkMulticast с аргументом mcastaddr.
- Примечание API:
- Интерфейс по умолчанию для отправки исходящих мультимедиа-датаграмм можно настроить с помощью
setOption(SocketOption, Object)иStandardSocketOptions.IP_MULTICAST_IF. - Параметры:
-
mcastaddr- указывает адрес мультимедиа-группы для присоединения. -
netIf- задаёт локальный интерфейс для получения пакетов мультимедиа-датаграмм, илиnull. - Исключения:
-
IOException- если возникла ошибка при присоединении, или если адрес не является адресом мультимедиа-группы, или платформа не поддерживает мультимедиа -
SecurityException- если существует менеджер безопасности, и его методcheckMulticastне разрешает присоединение. -
IllegalArgumentException- если mcastaddr являетсяnullили является классом SocketAddress, не поддерживаемым этим сокетом - С:
- 17
- См. также:
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
Если существует менеджер безопасности, этот метод сначала вызывает свой метод checkMulticast с аргументом mcastaddr.
- Примечание API:
- Аргументы
mcastaddrиnetIfдолжны определять группу мультимедиа, которая ранее была присоединена к этомуDatagramSocket.Этот метод можно вызвать несколько раз, чтобы выйти из нескольких различных групп мультимедиа, которые были ранее присоединения, или из одной и той же группы, которая была присоединена в нескольких различных сетях. Однако, если сокет не является членом указанной группы в указанной сети, будет брошено исключение
IOException. - Параметры:
-
mcastaddr- адрес мультимедиа-группы, из которой нужно выйти. Он должен содержать тот же IP-адрес, что и используемый для присоединения к группе. -
netIf- задаёт локальный интерфейс илиnullдля использования интерфейса, заданного для исходящих пакетов мультимедиа-датаграмм. Еслиnull, и интерфейс не задан, поведение не определено: может быть выбран любой интерфейс или операция может завершиться ошибкойSocketException. - Исключения:
-
IOException- если возникла ошибка при выходе или если адрес не является адресом мультимедиа-группы. -
SecurityException- если существует менеджер безопасности, и его методcheckMulticastне разрешает операцию. -
IllegalArgumentException- если mcastaddr являетсяnullили является классом SocketAddress, не поддерживаемым этим сокетом. - С:
- 17
- См. также:
© 1993, 2023, 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/21/docs/api/java.base/java/net/DatagramSocket.html
DatagramChannelили подклассDatagramSocketнапрямую.