Spec-Zone.ru › OpenJDK 27

Класс DatagramSocket

java.lang.Object
java.net.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 для отправки и получения дейтаграмм многоадресной рассылки. API MulticastChannel поддерживает многоадресную рассылку как из любого источника, так и для указанного источника. Для многоадресной рассылки рассмотрите возможность использования 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-дейтаграммы многоадресной рассылки, следует учитывать следующее:

  1. В отличие от DatagramChannel, конструкторы DatagramSocket не позволяют указать ProtocolFamily базового сокета. Следовательно, семейство протоколов базового сокета может не соответствовать семейству протоколов групп многоадресной рассылки, в которые попытается вступить DatagramSocket.
    Нет гарантии, что DatagramSocket с базовым сокетом, созданным для одного семейства протоколов, сможет вступить в группу многоадресной рассылки и получать ее дейтаграммы, если адрес группы соответствует другому семейству протоколов. Например, зависит от реализации, сможет ли DatagramSocket с сокетом IPv6 вступить в группу многоадресной рассылки IPv4 и получать отправленные этой группе дейтаграммы.
  2. Перед вступлением в группу многоадресной рассылки DatagramSocket следует привязать к адресу подстановки. Если сокет привязан к конкретному адресу, а не к адресу подстановки, то получение им дейтаграмм многоадресной рассылки зависит от реализации.
  3. Параметр SO_REUSEADDR следует включить до привязки сокета. Это необходимо, чтобы несколько участников группы могли привязаться к одному адресу.
Начиная с:
1.0
См. также:
  • DatagramPacket
  • DatagramChannel

Краткое описание конструкторов

DatagramSocket()
DatagramSocket(int port)
DatagramSocket(int port, InetAddress laddr)
DatagramSocket(DatagramSocketImpl impl)
DatagramSocket(SocketAddress bindaddr)
Модификатор Конструктор Описание
Создает сокет дейтаграмм и привязывает его к любому доступному порту на локальном компьютере.
Создает сокет дейтаграмм и привязывает его к указанному порту на локальном компьютере.
Создает сокет дейтаграмм, привязанный к указанному локальному адресу.
protected
Создает непривязанный сокет дейтаграмм с указанным DatagramSocketImpl.
Создает сокет дейтаграмм, привязанный к указанному локальному адресу сокета.

Краткое описание методов

Модификатор и тип Метод Описание
void bind(SocketAddress addr)
Привязывает этот DatagramSocket к определенному адресу и порту.
void close()
Закрывает этот сокет дейтаграмм.
void connect(InetAddress address, int port)
Подключает сокет к удаленному адресу.
void connect(SocketAddress addr)
Подключает этот сокет к удаленному адресу сокета (IP-адрес + номер порта).
void disconnect()
Отключает сокет.
boolean getBroadcast()
Проверяет, включен ли параметр SO_BROADCAST.
DatagramChannel getChannel()
Возвращает уникальный объект DatagramChannel, связанный с этим сокетом дейтаграмм, если он существует.
InetAddress getInetAddress()
Возвращает адрес, к которому подключен этот сокет.
InetAddress getLocalAddress()
Возвращает локальный адрес, к которому привязан сокет.
int getLocalPort()
Возвращает номер порта на локальном компьютере, к которому привязан этот сокет.
SocketAddress getLocalSocketAddress()
Возвращает адрес конечной точки, к которой привязан этот сокет.
<T> T getOption(SocketOption<T> name)
Возвращает значение параметра сокета.
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(SocketAddress mcastaddr, NetworkInterface netIf)
Вступает в группу многоадресной рассылки.
void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
Выходит из группы многоадресной рассылки через указанный локальный интерфейс.
void receive(DatagramPacket p)
Получает пакет дейтаграмм через этот сокет.
void send(DatagramPacket p)
Отправляет пакет дейтаграмм через этот сокет.
void setBroadcast(boolean on)
Включает или отключает SO_BROADCAST.
static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)
Устарело.
Используйте DatagramChannel или создайте подкласс непосредственно от DatagramSocket.
<T> DatagramSocket setOption(SocketOption<T> name, T value)
Устанавливает значение параметра сокета.
void setReceiveBufferSize(int size)
Устанавливает для параметра SO_RCVBUF указанное значение в этом DatagramSocket.
void setReuseAddress(boolean on)
Включает или отключает параметр сокета SO_REUSEADDR.
void setSendBufferSize(int size)
Устанавливает для параметра SO_SNDBUF указанное значение в этом DatagramSocket.
void setSoTimeout(int timeout)
Включает или отключает SO_TIMEOUT, задавая время ожидания в миллисекундах.
void setTrafficClass(int tc)
Устанавливает класс трафика или октет типа обслуживания в заголовке IP-дейтаграммы для дейтаграмм, отправляемых этим DatagramSocket.
Set<SocketOption<?>> supportedOptions()
Возвращает набор параметров сокета, поддерживаемых этим сокетом.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли этот объект другому объекту.
protected void finalize()
Устарело; подлежит удалению: этот элемент API подлежит удалению в будущей версии.
Финализация устарела и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения определенного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения определенного промежутка реального времени.

Подробное описание конструкторов

DatagramSocket

public DatagramSocket() throws SocketException
Создаёт сокет датаграмм и привязывает его к любому доступному порту на локальном компьютере. Сокет будет привязан к адресу wildcard.
Вызывает исключение:
SocketException — если не удалось открыть сокет или привязать его.

DatagramSocket

protected DatagramSocket(DatagramSocketImpl impl)
Создаёт непривязанный сокет датаграмм с указанным DatagramSocketImpl.
Параметры:
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
Привязывает этот DatagramSocket к определённому адресу и порту.

Если адрес равен 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
См. также:
  • disconnect()

connect

public void connect(SocketAddress addr) throws SocketException
Подключает этот сокет к адресу удалённого сокета (IP-адресу и номеру порта).

Если передан объект 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
См. также:
  • connect(InetAddress, int)

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
См. также:
  • getInetAddress()
  • getPort()
  • connect(SocketAddress)

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()
Возвращает адрес конечной точки, к которой привязан этот сокет.

Если сокет изначально был привязан к адресу-шаблону и теперь connected, возвращённый адрес может быть локальным адресом, выбранным в качестве исходного для датаграмм, отправляемых через этот сокет, а не адресом-шаблоном. При вызове disconnect() привязанный адрес снова становится адресом-шаблоном.

Возвращает:
объект SocketAddress, представляющий локальную конечную точку этого сокета, или null, если сокет закрыт или ещё не привязан.
Начиная с:
1.4
См. также:
  • getLocalAddress()
  • getLocalPort()
  • bind(SocketAddress)

send

public void send(DatagramPacket p) throws IOException
Отправляет пакет датаграммы через этот сокет. DatagramPacket содержит сведения об отправляемых данных, их длине, IP-адресе удалённого узла и номере порта на удалённом узле.
Параметры:
p — DatagramPacket для отправки.
Вызывает исключение:
IOException — если произошла ошибка ввода-вывода или сокет закрыт.
PortUnreachableException — может быть вызвано, если сокет подключён к недоступному в данный момент узлу назначения. Обратите внимание: нет гарантии, что исключение будет вызвано.
IllegalBlockingModeException — если с этим сокетом связан канал и он работает в неблокирующем режиме.
IllegalArgumentException — если сокет подключён, а адрес подключения отличается от адреса пакета, либо если сокет не подключён и адрес пакета не задан или его порт находится вне допустимого диапазона.
См. также:
  • DatagramPacket

receive

public void receive(DatagramPacket p) throws IOException
Получает пакет датаграммы через этот сокет. Метод блокируется до получения датаграммы. После возврата из метода буфер объекта DatagramPacket заполнен полученными данными. Пакет датаграммы также содержит IP-адрес отправителя и номер порта на компьютере отправителя. Поле length объекта пакета датаграммы содержит длину полученного сообщения. Если сообщение длиннее пакета, оно усекается.

Этот метод может быть прерван в следующих случаях:

  1. Сокет датаграмм связан с DatagramChannel. В этом случае прерывание потока, ожидающего получения пакета датаграммы, закроет нижележащий канал и приведёт к вызову этим методом ClosedByInterruptException; при этом статус прерывания потока будет установлен.
  2. Сокет датаграмм использует реализацию сокетов по умолчанию для системы, а пакет датаграммы получает виртуальный поток. В этом случае прерывание виртуального потока приведёт к его пробуждению и закрытию сокета. Затем этот метод вызовет SocketException; при этом статус прерывания потока будет установлен.
Параметры:
p — DatagramPacket, в который помещаются входящие данные.
Вызывает исключение:
IOException — если произошла ошибка ввода-вывода или сокет закрыт.
SocketTimeoutException — если ранее был вызван setSoTimeout и время ожидания истекло.
PortUnreachableException — может быть вызвано, если сокет подключён к недоступному в данный момент узлу назначения. Обратите внимание: нет гарантии, что исключение будет вызвано.
IllegalBlockingModeException — если с этим сокетом связан канал и он работает в неблокирующем режиме.
См. также:
  • DatagramPacket
  • DatagramSocket

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
Включает или отключает SO_TIMEOUT, задавая время ожидания в миллисекундах. Если для этого параметра задано положительное значение времени ожидания, вызов receive() для этого DatagramSocket будет блокироваться не дольше указанного времени. По истечении времени ожидания вызывается java.net.SocketTimeoutException, однако DatagramSocket остаётся действительным. Нулевое время ожидания означает бесконечное ожидание. Чтобы параметр подействовал, его необходимо включить до начала блокирующей операции.
Параметры:
timeout — заданное время ожидания в миллисекундах.
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
IllegalArgumentException — если timeout отрицательно
Начиная с:
1.1
См. также:
  • getSoTimeout()

getSoTimeout

public int getSoTimeout() throws SocketException
Возвращает значение параметра SO_TIMEOUT. Возвращаемое значение 0 означает, что параметр отключён (то есть время ожидания бесконечно).
Возвращает:
значение параметра SO_TIMEOUT
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.1
См. также:
  • setSoTimeout(int)

setSendBufferSize

public void setSendBufferSize(int size) throws SocketException
Задаёт для этого DatagramSocket указанное значение параметра SO_SNDBUF. Сетевая реализация использует параметр 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()
  • StandardSocketOptions.SO_SNDBUF

getSendBufferSize

public int getSendBufferSize() throws SocketException
Возвращает значение параметра SO_SNDBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для вывода через этот DatagramSocket.
Примечание к API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.SO_SNDBUF).
Возвращает:
значение параметра SO_SNDBUF для этого DatagramSocket
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.2
См. также:
  • setSendBufferSize(int)
  • StandardSocketOptions.SO_SNDBUF

setReceiveBufferSize

public void setReceiveBufferSize(int size) throws SocketException
Задаёт для этого DatagramSocket указанное значение параметра SO_RCVBUF. Сетевая реализация использует параметр 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()
  • StandardSocketOptions.SO_RCVBUF

getReceiveBufferSize

public int getReceiveBufferSize() throws SocketException
Возвращает значение параметра SO_RCVBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для ввода через этот DatagramSocket.
Примечание к API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.SO_RCVBUF).
Возвращает:
значение параметра SO_RCVBUF для этого DatagramSocket
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.2
См. также:
  • setReceiveBufferSize(int)
  • StandardSocketOptions.SO_RCVBUF

setReuseAddress

public void setReuseAddress(boolean on) throws SocketException
Включает или отключает параметр сокета SO_REUSEADDR.

Для 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()
  • bind(SocketAddress)
  • isBound()
  • isClosed()
  • StandardSocketOptions.SO_REUSEADDR

getReuseAddress

public boolean getReuseAddress() throws SocketException
Проверяет, включён ли SO_REUSEADDR.
Примечание к API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.SO_REUSEADDR).
Возвращает:
значение boolean, указывающее, включён ли SO_REUSEADDR.
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.4
См. также:
  • setReuseAddress(boolean)
  • StandardSocketOptions.SO_REUSEADDR

setBroadcast

public void setBroadcast(boolean on) throws SocketException
Включает или отключает SO_BROADCAST.

В некоторых операционных системах для включения этого параметра или отправки широковещательных датаграмм виртуальную машину Java может потребоваться запускать с разрешениями, зависящими от реализации.

Примечание к API:
Этот метод эквивалентен вызову setOption(StandardSocketOptions.SO_BROADCAST, on).
Параметры:
on — включить или отключить широковещательную передачу.
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.4
См. также:
  • getBroadcast()
  • StandardSocketOptions.SO_BROADCAST

getBroadcast

public boolean getBroadcast() throws SocketException
Проверяет, включён ли SO_BROADCAST.
Примечание к API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.SO_BROADCAST).
Возвращает:
значение boolean, указывающее, включён ли SO_BROADCAST.
Вызывает исключение:
SocketException — если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт.
Начиная с:
1.4
См. также:
  • setBroadcast(boolean)
  • StandardSocketOptions.SO_BROADCAST

setTrafficClass

public void setTrafficClass(int tc) throws SocketException
Устанавливает класс трафика или октет типа обслуживания в заголовке IP-дейтаграммы для дейтаграмм, отправляемых этим DatagramSocket. Поскольку нижележащая сетевая реализация может игнорировать это значение, приложениям следует рассматривать его как подсказку.

Значение 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)
Последний младший бит всегда игнорируется, поскольку он соответствует биту MBZ (должен быть нулём).

Установка битов в поле приоритета может привести к SocketException, указывающему, что операция не разрешена.

для протокола Internet Protocol v6 tc — это значение, которое будет помещено в поле sin6_flowinfo заголовка IP.

Примечание к API:
Этот метод эквивалентен вызову setOption(StandardSocketOptions.IP_TOS, tc).
Параметры:
tc — значение int для битового набора.
Исключения:
SocketException — если при установке класса трафика или типа обслуживания произошла ошибка либо сокет закрыт.
С версии:
1.4
См. также:
  • getTrafficClass()
  • StandardSocketOptions.IP_TOS

getTrafficClass

public int getTrafficClass() throws SocketException
Возвращает класс трафика или тип обслуживания в заголовке IP-дейтаграммы для пакетов, отправляемых этим DatagramSocket.

Поскольку нижележащая сетевая реализация может игнорировать класс трафика или тип обслуживания, заданные с помощью setTrafficClass(int), этот метод может вернуть значение, отличное от ранее заданного методом setTrafficClass(int) для этого DatagramSocket.

Примечание к API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.IP_TOS).
Возвращает:
уже заданный класс трафика или тип обслуживания
Исключения:
SocketException — если при получении значения класса трафика или типа обслуживания произошла ошибка либо сокет закрыт.
С версии:
1.4
См. также:
  • setTrafficClass(int)
  • StandardSocketOptions.IP_TOS

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
См. также:
  • DatagramSocketImplFactory.createDatagramSocketImpl()

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
См. также:
  • MulticastChannel.join(InetAddress, NetworkInterface)
  • StandardSocketOptions.IP_MULTICAST_IF

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
См. также:
  • joinGroup(SocketAddress, NetworkInterface)
  • StandardSocketOptions.IP_MULTICAST_IF

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API