Spec-Zone.ru › OpenJDK 24

Класс 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()
Возвращает набор параметров сокета, поддерживаемых данным сокетом.

Методы, объявленные в классе java.lang.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 destination unreachable, то последующий вызов 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(java.net.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, если он ещё не подключен.
Since:
1.4
См. также:
  • getInetAddress()
  • getPort()
  • connect(SocketAddress)

getLocalSocketAddress

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

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

Возвращает:
объект SocketAddress, представляющий локальную конечную точку этого сокета, или null, если он закрыт или ещё не привязан.
Since:
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 адрес, если сокет не привязан
Since:
1.1

getLocalPort

public int getLocalPort()
Возвращает номер порта на локальном узле, к которому привязан этот сокет.
Возвращает:
номер порта на локальном узле, к которому привязан этот сокет, -1, если сокет закрыт, или 0, если он ещё не привязан.

setSoTimeout

public void setSoTimeout(int timeout) throws SocketException
Включает/выключает SO_TIMEOUT со заданным таймаутом в миллисекундах. При установке этого параметра на положительное значение таймаута вызов receive() для этого DatagramSocket будет блокироваться только на это время. Если таймаут истекает, генерируется исключение java.net.SocketTimeoutException, хотя DatagramSocket по-прежнему валиден. Таймаут 0 интерпретируется как бесконечный таймаут. Параметр **обязательно** должен быть включён перед входом в блокирующую операцию, чтобы он имел эффект.
Параметры:
timeout - заданный таймаут в миллисекундах.
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка UDP, или сокет закрыт.
IllegalArgumentException - если timeout отрицательное
Since:
1.1
См. также:
  • getSoTimeout()

getSoTimeout

public int getSoTimeout() throws SocketException
Получение значения SO_TIMEOUT. 0 означает, что параметр отключён (т.е. таймаут бесконечен).
Возвращает:
значение SO_TIMEOUT
Исключения:
SocketException - если произошла ошибка в базовом протоколе, например, ошибка UDP, или сокет закрыт.
Since:
1.1
См. также:
  • setSoTimeout(int)

setSendBufferSize

public void setSendBufferSize(int size) throws SocketException
Устанавливает параметр SO_SNDBUF для этого 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 или отрицательно.
Since:
1.2
См. также:
  • getSendBufferSize()
  • StandardSocketOptions.SO_SNDBUF

getSendBufferSize

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

setReceiveBufferSize

public void setReceiveBufferSize(int size) throws SocketException
Устанавливает параметр 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 для данного сокета. Представляет размер буфера, в байтах, используемого платформой для ввода данных в этом сокете.
Примечание API:
Этот метод эквивалентен вызову getOption(StandardSocketOptions.SO_RCVBUF).
Возвращает:
значение параметра SO_RCVBUF для этого сокета
Исключения:
SocketException - если произошла ошибка в протоколе (например, ошибка UDP) или сокет закрыт.
С:
1.2
См. также:
  • setReceiveBufferSize(int)
  • StandardSocketOptions.SO_RCVBUF

setReuseAddress

public void setReuseAddress(boolean on) throws SocketException
Включение/выключение параметра SO_REUSEADDR.

Для UDP-сокетa может потребоваться привязать несколько сокетов к одному адресу. Это обычно необходимо для приема мультивещательных пакетов (см. MulticastSocket). Параметр SO_REUSEADDR позволяет привязать несколько сокетов к одному адресу, если параметр SO_REUSEADDR включён до привязки сокета с помощью bind(SocketAddress).

Примечание: Эта функциональность не поддерживается всеми платформами, поэтому поведение зависит от реализации. Однако, если она не поддерживается, то getReuseAddress() всегда вернёт false.

При создании сокета 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).
Возвращает:
значение, указывающее, включен ли 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).
Возвращает:
значение, указывающее, включен ли 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 - значение для битовой комбинации.
Исключения:
SocketException - если произошла ошибка при установке класса трафика или типа сервиса, или сокет закрыт.
С:
1.4
См. также:
  • getTrafficClass()
  • StandardSocketOptions.IP_TOS

getTrafficClass

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

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

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

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 методу - это действие без последствий, если фабрика еще не была установлена.

Параметры:
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 - если имя является null
С:
9

getOption

public <T> T getOption(SocketOption<T> name) throws IOException
Возвращает значение параметра сокета.
Типы параметров:
T - Тип значения параметра сокета
Параметры:
name - Параметр сокета
Возвращает:
Значение параметра сокета.
Исключение:
UnsupportedOperationException - если сокет датаграммы не поддерживает параметр.
IOException - если произошла ошибка ввода/вывода, или сокет закрыт.
NullPointerException - если имя является 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 Note:
По умолчанию интерфейс для отправки исходящих датаграмм мультикаста можно настроить с помощью 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

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/net/DatagramSocket.html

Spec-Zone.ru

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