Spec-Zone.ru › OpenJDK 25

Класс 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

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

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
Устанавливает параметр SO_SNDBUF в указанное значение для этого DatagramSocket. Параметр SO_SNDBUF используется сетевой реализацией как рекомендация по размеру базовых буферов сетевого ввода-вывода. Сетевая реализация также может использовать значение SO_SNDBUF для определения максимального размера пакета, который можно отправить через этот сокет.

Поскольку SO_SNDBUF является рекомендацией, приложениям, которым нужно проверить размер буфера, следует вызвать getSendBufferSize().

Увеличение размера буфера может позволить сетевой реализации поставить в очередь несколько исходящих пакетов при высокой скорости отправки.

Примечание: если для отправки DatagramPacket, размер которого превышает значение SO_SNDBUF, используется send(DatagramPacket), будет ли пакет отправлен или отброшен, зависит от реализации.

Примечание к API:
Если size > 0, этот метод эквивалентен вызову setOption(StandardSocketOptions.SO_SNDBUF, size).
Параметры:
size — размер буфера отправки в байтах. Значение должно быть больше 0.
Исключения:
SocketException — если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт.
IllegalArgumentException — если значение равно 0 или отрицательно.
С версии:
1.2
См. также:
  • getSendBufferSize()
  • 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
Устанавливает параметр SO_RCVBUF в указанное значение для этого DatagramSocket. Параметр SO_RCVBUF используется сетевой реализацией как рекомендация по размеру базовых буферов сетевого ввода-вывода. Сетевая реализация также может использовать значение SO_RCVBUF для определения максимального размера пакета, который можно получить через этот сокет.

Поскольку SO_RCVBUF является рекомендацией, приложениям, которым нужно проверить размер буферов, следует вызвать getReceiveBufferSize().

Увеличение SO_RCVBUF может позволить сетевой реализации буферизовать несколько пакетов, если пакеты поступают быстрее, чем их удается получать с помощью receive(DatagramPacket).

Примечание: возможность получения пакета размером больше SO_RCVBUF зависит от реализации.

Примечание к API:
Если size > 0, этот метод эквивалентен вызову setOption(StandardSocketOptions.SO_RCVBUF, size).
Параметры:
size — размер буфера приема в байтах. Значение должно быть больше 0.
Исключения:
SocketException — если в базовом протоколе произошла ошибка, например ошибка UDP, или сокет закрыт.
IllegalArgumentException — если значение равно 0 или отрицательно.
С версии:
1.2
См. также:
  • getReceiveBufferSize()
  • 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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/net/DatagramSocket.html

Spec-Zone.ru

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