Класс DatagramSocket
- Все реализуемые интерфейсы:
Closeable, AutoCloseable
- Прямые известные подклассы:
MulticastSocket
public class DatagramSocket extends Object implements Closeable
Сокет дейтаграмм — это точка отправки или получения пакетов службы доставки. Каждый пакет, отправленный или полученный через сокет дейтаграмм, адресуется и маршрутизируется отдельно. Разные пакеты, отправленные с одной машины на другую, могут маршрутизироваться по-разному и прибывать в любом порядке.
Если это возможно, у только что созданного DatagramSocket включена опция сокета SO_BROADCAST, позволяющая передавать широковещательные дейтаграммы. Чтобы получать широковещательные пакеты, DatagramSocket должен быть привязан к адресу подстановки. В некоторых реализациях широковещательные пакеты также могут приниматься, если DatagramSocket привязан к более конкретному адресу.
Пример:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
Что эквивалентно: DatagramSocket s = new DatagramSocket(8888);
В обоих случаях будет создан DatagramSocket, способный принимать широковещательные сообщения на UDP-порту 8888. Класс DatagramSocket определяет вспомогательные методы для установки и получения значений нескольких параметров сокета. Этот класс также определяет методы setOption и getOption для установки параметров сокета и получения их значений. DatagramSocket поддерживает следующие параметры сокета:
Имя параметра Описание SO_SNDBUFРазмер буфера отправки сокета в байтах SO_RCVBUFРазмер буфера приема сокета в байтах SO_REUSEADDRПовторное использование адреса SO_BROADCASTРазрешить передачу широковещательных дейтаграмм IP_TOSОктет типа обслуживания (ToS) в заголовке протокола Интернета (IP)
Кроме того, класс DatagramSocket определяет методы для вступления в группу многоадресной рассылки и выхода из нее, а также поддерживает параметры многоадресной рассылки, полезные при вступлении в группу многоадресной рассылки, выходе из нее или отправке ей дейтаграмм. Поддерживаются следующие параметры многоадресной рассылки:
Реализация также может поддерживать дополнительные параметры.
Имя параметра Описание IP_MULTICAST_IFСетевой интерфейс для дейтаграмм многоадресной рассылки по протоколу Интернета (IP) IP_MULTICAST_TTLВремя жизни дейтаграмм многоадресной рассылки по протоколу Интернета (IP) IP_MULTICAST_LOOPЗацикливание дейтаграмм многоадресной рассылки по протоколу Интернета (IP)
- Примечание к API:
-
Многоадресная рассылка с помощью DatagramSocket
DatagramChannelреализует интерфейсMulticastChannelи предоставляет альтернативный API для отправки и получения дейтаграмм многоадресной рассылки. APIMulticastChannelподдерживает многоадресную рассылку как из любого источника, так и для указанного источника. Для многоадресной рассылки рассмотрите возможность использованияDatagramChannel.DatagramSocketможно напрямую использовать для многоадресной рассылки. Однако, в отличие отMulticastSocket,DatagramSocketне вызывает методsetReuseAddress(boolean)для включения параметра сокета SO_REUSEADDR по умолчанию. Если создаетсяDatagramSocket, предназначенный для последующего вступления в группу многоадресной рассылки, вызывающей стороне следует рассмотреть возможность явного включения параметра SO_REUSEADDR.Экземпляр
DatagramSocketможно использовать для отправки или получения пакетов дейтаграмм многоадресной рассылки. Для отправки дейтаграмм многоадресной рассылки вступать в группу не требуется. Однако перед отправкой пакетов дейтаграмм многоадресной рассылки следует настроить исходящий интерфейс по умолчанию с помощьюsetOptionиStandardSocketOptions.IP_MULTICAST_IF:DatagramSocket sender = new DatagramSocket(new InetSocketAddress(0)); NetworkInterface outgoingIf = NetworkInterface.getByName("en0"); sender.setOption(StandardSocketOptions.IP_MULTICAST_IF, outgoingIf); // optionally configure multicast TTL; the TTL defines the scope of a // multicast datagram, for example, confining it to host local (0) or // link local (1) etc... int ttl = ...; // a number between 0 and 255 sender.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); // send a packet to a multicast group byte[] msgBytes = ...; InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); int port = 6789; InetSocketAddress dest = new InetSocketAddress(mcastaddr, port); DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, dest); sender.send(hi);Экземпляр
DatagramSocketтакже можно использовать для приема пакетов дейтаграмм многоадресной рассылки.DatagramSocket, созданный для приема дейтаграмм многоадресной рассылки, следует создавать непривязанным. Перед привязкой сокета необходимо настроитьsetReuseAddress(true):DatagramSocket socket = new DatagramSocket(null); // unbound socket.setReuseAddress(true); // set reuse address before binding socket.bind(new InetSocketAddress(6789)); // bind // joinGroup 228.5.6.7 InetAddress mcastaddr = InetAddress.getByName("228.5.6.7"); InetSocketAddress group = new InetSocketAddress(mcastaddr, 0); NetworkInterface netIf = NetworkInterface.getByName("en0"); socket.joinGroup(group, netIf); byte[] msgBytes = new byte[1024]; // up to 1024 bytes DatagramPacket packet = new DatagramPacket(msgBytes, msgBytes.length); socket.receive(packet); .... // eventually leave group socket.leaveGroup(group, netIf);Зависимость от платформы
Реализация многоадресной рассылки предназначена для прямого соответствия встроенным средствам многоадресной рассылки. Поэтому при разработке приложения, принимающего IP-дейтаграммы многоадресной рассылки, следует учитывать следующее:
- В отличие от
DatagramChannel, конструкторыDatagramSocketне позволяют указатьProtocolFamilyбазового сокета. Следовательно, семейство протоколов базового сокета может не соответствовать семейству протоколов групп многоадресной рассылки, в которые попытается вступитьDatagramSocket.
Нет гарантии, чтоDatagramSocketс базовым сокетом, созданным для одного семейства протоколов, сможет вступить в группу многоадресной рассылки и получать ее дейтаграммы, если адрес группы соответствует другому семейству протоколов. Например, зависит от реализации, сможет лиDatagramSocketс сокетом IPv6 вступить в группу многоадресной рассылки IPv4 и получать отправленные этой группе дейтаграммы. - Перед вступлением в группу многоадресной рассылки
DatagramSocketследует привязать к адресу подстановки. Если сокет привязан к конкретному адресу, а не к адресу подстановки, то получение им дейтаграмм многоадресной рассылки зависит от реализации. - Параметр SO_REUSEADDR следует включить до привязки сокета. Это необходимо, чтобы несколько участников группы могли привязаться к одному адресу.
- В отличие от
- Начиная с:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создает сокет дейтаграмм и привязывает его к любому доступному порту на локальном компьютере. |
||
| Создает сокет дейтаграмм и привязывает его к указанному порту на локальном компьютере. |
||
| Создает сокет дейтаграмм, привязанный к указанному локальному адресу. |
||
protected |
Создает непривязанный сокет дейтаграмм с указанным DatagramSocketImpl. |
|
| Создает сокет дейтаграмм, привязанный к указанному локальному адресу сокета. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
bind |
Привязывает этот DatagramSocket к определенному адресу и порту. |
void |
close() |
Закрывает этот сокет дейтаграмм. |
void |
connect |
Подключает сокет к удаленному адресу. |
void |
connect |
Подключает этот сокет к удаленному адресу сокета (IP-адрес + номер порта). |
void |
disconnect() |
Отключает сокет. |
boolean |
getBroadcast() |
Проверяет, включен ли параметр SO_BROADCAST. |
DatagramChannel |
getChannel() |
Возвращает уникальный объект DatagramChannel, связанный с этим сокетом дейтаграмм, если он существует. |
InetAddress |
getInetAddress() |
Возвращает адрес, к которому подключен этот сокет. |
InetAddress |
getLocalAddress() |
Возвращает локальный адрес, к которому привязан сокет. |
int |
getLocalPort() |
Возвращает номер порта на локальном компьютере, к которому привязан этот сокет. |
SocketAddress |
getLocalSocketAddress() |
Возвращает адрес конечной точки, к которой привязан этот сокет. |
<T> T |
getOption |
Возвращает значение параметра сокета. |
int |
getPort() |
Возвращает номер порта, к которому подключен этот сокет. |
int |
getReceiveBufferSize() |
Возвращает значение параметра SO_RCVBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для приема данных через этот DatagramSocket. |
SocketAddress |
getRemoteSocketAddress() |
Возвращает адрес конечной точки, к которой подключен этот сокет, или null, если он не подключен. |
boolean |
getReuseAddress() |
Проверяет, включен ли параметр SO_REUSEADDR. |
int |
getSendBufferSize() |
Возвращает значение параметра SO_SNDBUF для этого DatagramSocket, то есть размер буфера в байтах, используемого платформой для отправки данных через этот DatagramSocket. |
int |
getSoTimeout() |
Получает значение параметра SO_TIMEOUT. Возвращаемое значение 0 означает, что параметр отключен (то есть время ожидания не ограничено). |
int |
getTrafficClass() |
Возвращает класс трафика или тип обслуживания в заголовке IP-дейтаграммы для пакетов, отправляемых этим DatagramSocket. |
boolean |
isBound() |
Возвращает состояние привязки сокета. |
boolean |
isClosed() |
Возвращает информацию о том, закрыт ли сокет. |
boolean |
isConnected() |
Возвращает состояние подключения сокета. |
void |
joinGroup |
Вступает в группу многоадресной рассылки. |
void |
leaveGroup |
Выходит из группы многоадресной рассылки через указанный локальный интерфейс. |
void |
receive |
Получает пакет дейтаграмм через этот сокет. |
void |
send |
Отправляет пакет дейтаграмм через этот сокет. |
void |
setBroadcast |
Включает или отключает SO_BROADCAST. |
static void |
setDatagramSocketImplFactory |
Устарело. |
<T> DatagramSocket |
setOption |
Устанавливает значение параметра сокета. |
void |
setReceiveBufferSize |
Устанавливает для параметра SO_RCVBUF указанное значение в этом DatagramSocket. |
void |
setReuseAddress |
Включает или отключает параметр сокета SO_REUSEADDR. |
void |
setSendBufferSize |
Устанавливает для параметра SO_SNDBUF указанное значение в этом DatagramSocket. |
void |
setSoTimeout |
Включает или отключает SO_TIMEOUT, задавая время ожидания в миллисекундах. |
void |
setTrafficClass |
Устанавливает класс трафика или октет типа обслуживания в заголовке IP-дейтаграммы для дейтаграмм, отправляемых этим DatagramSocket. |
Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим сокетом. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Показывает, равен ли этот объект другому объекту. |
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 |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения определенного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения определенного промежутка реального времени. |
Подробное описание конструкторов
DatagramSocket
public DatagramSocket() throws SocketException
wildcard.- Вызывает исключение:
-
SocketException— если не удалось открыть сокет или привязать его.
DatagramSocket
protected DatagramSocket(DatagramSocketImpl impl)
- Параметры:
-
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
Если адрес равен 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
- См. также:
connect
public void connect(SocketAddress addr) throws SocketException
Если передан объект 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
- См. также:
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
- См. также:
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
Если сокет изначально был привязан к адресу-шаблону и теперь connected, возвращённый адрес может быть локальным адресом, выбранным в качестве исходного для датаграмм, отправляемых через этот сокет, а не адресом-шаблоном. При вызове disconnect() привязанный адрес снова становится адресом-шаблоном.
- Возвращает:
- объект
SocketAddress, представляющий локальную конечную точку этого сокета, илиnull, если сокет закрыт или ещё не привязан. - Начиная с:
- 1.4
- См. также:
send
public void send(DatagramPacket p) throws IOException
DatagramPacket содержит сведения об отправляемых данных, их длине, IP-адресе удалённого узла и номере порта на удалённом узле.- Параметры:
-
p—DatagramPacketдля отправки. - Вызывает исключение:
-
IOException— если произошла ошибка ввода-вывода или сокет закрыт. -
PortUnreachableException— может быть вызвано, если сокет подключён к недоступному в данный момент узлу назначения. Обратите внимание: нет гарантии, что исключение будет вызвано. -
IllegalBlockingModeException— если с этим сокетом связан канал и он работает в неблокирующем режиме. -
IllegalArgumentException— если сокет подключён, а адрес подключения отличается от адреса пакета, либо если сокет не подключён и адрес пакета не задан или его порт находится вне допустимого диапазона. - См. также:
receive
public void receive(DatagramPacket p) throws IOException
DatagramPacket заполнен полученными данными. Пакет датаграммы также содержит IP-адрес отправителя и номер порта на компьютере отправителя. Поле length объекта пакета датаграммы содержит длину полученного сообщения. Если сообщение длиннее пакета, оно усекается. Этот метод может быть прерван в следующих случаях:
- Сокет датаграмм связан с
DatagramChannel. В этом случае прерывание потока, ожидающего получения пакета датаграммы, закроет нижележащий канал и приведёт к вызову этим методомClosedByInterruptException; при этом статус прерывания потока будет установлен. - Сокет датаграмм использует реализацию сокетов по умолчанию для системы, а пакет датаграммы получает виртуальный поток. В этом случае прерывание виртуального потока приведёт к его пробуждению и закрытию сокета. Затем этот метод вызовет
SocketException; при этом статус прерывания потока будет установлен.
- Параметры:
-
p—DatagramPacket, в который помещаются входящие данные. - Вызывает исключение:
-
IOException— если произошла ошибка ввода-вывода или сокет закрыт. -
SocketTimeoutException— если ранее был вызван setSoTimeout и время ожидания истекло. -
PortUnreachableException— может быть вызвано, если сокет подключён к недоступному в данный момент узлу назначения. Обратите внимание: нет гарантии, что исключение будет вызвано. -
IllegalBlockingModeException— если с этим сокетом связан канал и он работает в неблокирующем режиме. - См. также:
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
- Параметры:
-
timeout— заданное время ожидания в миллисекундах. - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. -
IllegalArgumentException— еслиtimeoutотрицательно - Начиная с:
- 1.1
- См. также:
getSoTimeout
public int getSoTimeout() throws SocketException
- Возвращает:
- значение параметра SO_TIMEOUT
- Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.1
- См. также:
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
public int getSendBufferSize() throws SocketException
DatagramSocket, то есть размер буфера в байтах, используемого платформой для вывода через этот DatagramSocket.- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_SNDBUF). - Возвращает:
- значение параметра SO_SNDBUF для этого
DatagramSocket - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.2
- См. также:
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
public int getReceiveBufferSize() throws SocketException
DatagramSocket, то есть размер буфера в байтах, используемого платформой для ввода через этот DatagramSocket.- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_RCVBUF). - Возвращает:
- значение параметра SO_RCVBUF для этого
DatagramSocket - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.2
- См. также:
setReuseAddress
public void setReuseAddress(boolean on) throws SocketException
Для UDP-сокетов может потребоваться привязать к одному адресу сокета несколько сокетов. Обычно это необходимо для получения многоадресных пакетов (см. MulticastSocket). Параметр сокета SO_REUSEADDR позволяет привязать несколько сокетов к одному адресу, если параметр сокета SO_REUSEADDR включён до привязки сокета с помощью bind(SocketAddress).
Примечание. Эта возможность поддерживается не всеми существующими платформами, поэтому решение о том, будет ли этот параметр игнорироваться, зависит от реализации. Однако, если эта возможность не поддерживается, getReuseAddress() всегда будет возвращать false.
При создании DatagramSocket параметр SO_REUSEADDR изначально отключён.
Поведение при включении или отключении SO_REUSEADDR после привязки сокета (см. isBound()) не определено.
- Примечание к API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_REUSEADDR, on). - Параметры:
-
on— включить или отключить параметр - Вызывает исключение:
-
SocketException— если при включении или отключении параметра сокетаSO_REUSEADDRпроизошла ошибка или сокет закрыт. - Начиная с:
- 1.4
- См. также:
getReuseAddress
public boolean getReuseAddress() throws SocketException
- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_REUSEADDR). - Возвращает:
- значение
boolean, указывающее, включён ли SO_REUSEADDR. - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.4
- См. также:
setBroadcast
public void setBroadcast(boolean on) throws SocketException
В некоторых операционных системах для включения этого параметра или отправки широковещательных датаграмм виртуальную машину Java может потребоваться запускать с разрешениями, зависящими от реализации.
- Примечание к API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.SO_BROADCAST, on). - Параметры:
-
on— включить или отключить широковещательную передачу. - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.4
- См. также:
getBroadcast
public boolean getBroadcast() throws SocketException
- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.SO_BROADCAST). - Возвращает:
- значение
boolean, указывающее, включён ли SO_BROADCAST. - Вызывает исключение:
-
SocketException— если произошла ошибка нижележащего протокола, например ошибка UDP, или сокет закрыт. - Начиная с:
- 1.4
- См. также:
setTrafficClass
public void setTrafficClass(int tc) throws SocketException
Значение 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)
Установка битов в поле приоритета может привести к SocketException, указывающему, что операция не разрешена.
для протокола Internet Protocol v6 tc — это значение, которое будет помещено в поле sin6_flowinfo заголовка IP.
- Примечание к API:
- Этот метод эквивалентен вызову
setOption(StandardSocketOptions.IP_TOS, tc). - Параметры:
-
tc— значениеintдля битового набора. - Исключения:
-
SocketException— если при установке класса трафика или типа обслуживания произошла ошибка либо сокет закрыт. - С версии:
- 1.4
- См. также:
getTrafficClass
public int getTrafficClass() throws SocketException
Поскольку нижележащая сетевая реализация может игнорировать класс трафика или тип обслуживания, заданные с помощью setTrafficClass(int), этот метод может вернуть значение, отличное от ранее заданного методом setTrafficClass(int) для этого DatagramSocket.
- Примечание к API:
- Этот метод эквивалентен вызову
getOption(StandardSocketOptions.IP_TOS). - Возвращает:
- уже заданный класс трафика или тип обслуживания
- Исключения:
-
SocketException— если при получении значения класса трафика или типа обслуживания произошла ошибка либо сокет закрыт. - С версии:
- 1.4
- См. также:
close
public void close()
Любой поток, заблокированный в данный момент в вызове receive(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
- См. также:
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
- См. также:
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
- См. также:
© 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.
DatagramChannelили создайте подкласс непосредственно отDatagramSocket.