Класс 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) в заголовке Internet Protocol (IP)
Кроме того, класс DatagramSocket определяет методы для присоединения и выхода из мультимедийной группы, и поддерживает мультимедийные параметры, которые полезны при присоединении, выходе или отправке пакетов в мультимедийную группу. Поддерживаются следующие мультимедийные параметры:
Реализация также может поддерживать дополнительные параметры.
Имя параметра Описание IP_MULTICAST_IFСетевой интерфейс для пакетов интернет-протокола (IP) multicast IP_MULTICAST_TTLВремя жизни для пакетов интернет-протокола (IP) multicast IP_MULTICAST_LOOPЦиклическое обращение для пакетов интернет-протокола (IP) multicast
- Примечание API:
-
Мультимедиа с DatagramSocket
DatagramChannelреализует интерфейсMulticastChannelи предоставляет альтернативный API для отправки и получения мультимедийных пакетов. APIMulticastChannelподдерживает как любой источник, так и конкретный источник multicast. Рассмотрите использование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 betwen 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 multicast, следует учитывать следующие моменты:
- В отличие от
DatagramChannel, конструкторыDatagramSocketне позволяют указатьProtocolFamilyбазового сокета. Следовательно, семейство протоколов базового сокета может не соответствовать семейству протоколов мультимедийных групп, к которымDatagramSocketпопытается присоединиться.
Нет гарантии, чтоDatagramSocketс базовым сокетом, созданным в одном семействе протоколов, может присоединиться и получать пакеты multicast, когда адрес мультимедийной группы соответствует другому семейству протоколов. Например, если сокет 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<SocketOption<?>> |
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 destination unreachable, то последующий вызов 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() истинно, этот метод вызывает метод менеджера безопасности 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 заполняется полученными данными. Пакет датаграммы также содержит IP-адрес отправителя и номер порта на машине отправителя. Этот метод блокируется до тех пор, пока не будет получена датаграмма. Поле length объекта пакета датаграммы содержит длину полученного сообщения. Если сообщение длиннее, чем длина пакета, сообщение усекается.
Если есть менеджер безопасности, и сокет в данный момент не подключен к удалённому адресу, пакет не может быть принят, если метод менеджера безопасности 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:
Установить размер буфера отправки
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 или отрицательно. - С:
- 1.2
- См. также:
Получить размер буфера отправки
public int getSendBufferSize() throws SocketException
DatagramSocket, то есть размер буфера в байтах, используемый платформой для вывода на этот DatagramSocket.- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_SNDBUF). - Возвращает:
- значение опции SO_SNDBUF для этого
DatagramSocket. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP. - С:
- 1.2
- См. также:
Установить размер буфера приема
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
- См. также:
Получить размер буфера приема
public int getReceiveBufferSize() throws SocketException
DatagramSocket, то есть размер буфера в байтах, используемый платформой для ввода на этот DatagramSocket.- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_RCVBUF). - Возвращает:
- значение опции SO_RCVBUF для этого
DatagramSocket - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP. - С:
- 1.2
- См. также:
Установить повторное использование адреса
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
- См. также:
Получить повторное использование адреса
public boolean getReuseAddress() throws SocketException
- Примечание API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_REUSEADDR). - Возвращает:
- значение, указывающее, включена ли опция SO_REUSEADDR.
- Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP. - С:
- 1.4
- См. также:
Установить режим широковещания
public void setBroadcast(boolean on) throws SocketException
Некоторые операционные системы могут потребовать, чтобы виртуальная машина Java запускалась с реализуемыми привилегиями, чтобы включить эту опцию или отправлять широковещательные пакеты.
- Примечание API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_BROADCAST, on). - Параметры:
-
on- включить или выключить широковещательный режим. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка UDP. - С:
- 1.4
- См. также:
Получить режим широковещания
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.
Примечания:
Для Интернет-протокола версии 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:
- Этот метод эквивалентен вызову
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(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 в метод является пустой операцией, если фабрика ещё не была установлена.
Если установлен менеджер безопасности, этот метод сначала вызывает метод checkSetFactory менеджера безопасности, чтобы убедиться, что операция разрешена. Это может привести к исключению SecurityException.
- Параметры:
-
fac- требуемая фабрика. - Исключения:
-
IOException- если произошла ошибка ввода-вывода при установке фабрики сокета датаграмм. -
SocketException- если фабрика уже определена. -
SecurityException- если менеджер безопасности существует и его методcheckSetFactoryне разрешает операцию. - С:
- 1.3
- См. также:
setOption
public <T> DatagramSocket setOption(SocketOption<T> name, T value) throws IOException
- Параметры типа:
-
T- Тип значения параметра сокета - Параметры:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров. - Возвращает:
- этот объект DatagramSocket
- Исключения:
-
UnsupportedOperationException- если сокет датаграмм не поддерживает параметр. -
IllegalArgumentException- если значение не является допустимым для параметра. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
SecurityException- если установлен менеджер безопасности и если параметр сокета требует разрешения на безопасность, и у вызывающего объекта нет необходимого разрешения.StandardSocketOptionsне требуют какого-либо разрешения на безопасность. -
NullPointerException- если имя являетсяnull - С:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Параметры типа:
-
T- Тип значения параметра сокета - Параметры:
-
name- Параметр сокета - Возвращает:
- Значение параметра сокета.
- Исключения:
-
UnsupportedOperationException- если сокет датаграмм не поддерживает параметр. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имя являетсяnull -
SecurityException- если установлен менеджер безопасности и если параметр сокета требует разрешения на безопасность, и у вызывающего объекта нет необходимого разрешения.StandardSocketOptionsне требуют какого-либо разрешения на безопасность. - С:
- 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.
Если существует менеджер безопасности, этот метод сначала вызывает свой метод 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, 2021, 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/17/docs/api/java.base/java/net/DatagramSocket.html
DatagramChannel, или подклассируйтеDatagramSocketнапрямую.