Интерфейс SocketOptions
- Все известные реализующие классы:
-
DatagramSocketImpl,SocketImpl
public interface SocketOptions
Интерфейс методов для получения/установки параметров сокета. Этот интерфейс реализуется: SocketImpl и DatagramSocketImpl. Подклассы этих классов должны переопределять методы этого интерфейса, чтобы поддерживать свои собственные параметры.
Методы и константы, которые определяют параметры в этом интерфейсе, предназначены только для реализации. Если вы не наследуете от SocketImpl или DatagramSocketImpl, вы не будете использовать их напрямую. Существуют безопасные по типу методы для получения/установки каждого из этих параметров в Socket, ServerSocket, DatagramSocket и MulticastSocket.
- С тех пор:
- 1.1
Поля
| Модификатор и тип | Поле | Описание |
|---|---|---|
static int | IP_MULTICAST_IF | Устанавливает интерфейс отправки мультимедийных пакетов. |
static int | IP_MULTICAST_IF2 | То же, что и выше. |
static int | IP_MULTICAST_LOOP | Этот параметр включает или отключает локальный обмен мультимедийными пакетами. |
static int | IP_TOS | Этот параметр задает поле типа службы или класса трафика в заголовке IP для TCP или UDP сокета. |
static int | SO_BINDADDR | Получение локального адреса привязки сокета (этот параметр нельзя «установить», только «получить», так как сокеты привязываются при создании, и поэтому локальный привязанный адрес нельзя изменить). |
static int | SO_BROADCAST | Устанавливает SO_BROADCAST для сокета. |
static int | SO_KEEPALIVE | Когда параметр keepalive установлен для TCP-сокета и в течение 2 часов не было обмена данными через сокет в обоих направлениях (ПРИМЕЧАНИЕ: фактическое значение зависит от реализации), TCP автоматически отправляет запрос keepalive партнеру. |
static int | SO_LINGER | Указывает таймаут ожидания при закрытии. |
static int | SO_OOBINLINE | При установке параметра OOBINLINE все срочные данные TCP, полученные по сокету, будут получены через поток ввода сокета. |
static int | SO_RCVBUF | Устанавливает подсказку о размере буферов, используемых платформой для входящего сетевого ввода-вывода. |
static int | SO_REUSEADDR | Устанавливает SO_REUSEADDR для сокета. |
static int | SO_REUSEPORT | Устанавливает SO_REUSEPORT для сокета. |
static int | SO_SNDBUF | Устанавливает подсказку о размере буферов, используемых платформой для исходящего сетевого ввода-вывода. |
static int | SO_TIMEOUT | Устанавливает таймаут для блокирующих операций сокета: |
static int | TCP_NODELAY | Отключает алгоритм Найгла для этого соединения. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Object | getOption(int optID) | Получение значения параметра. |
void | setOption(int optID,
Object value) | Включение/выключение параметра, указанного в optID. |
Поля
TCP_NODELAY
@Native static final int TCP_NODELAY
Отключить алгоритм Нагле для этого соединения. Данные, отправляемые в сеть, не буферизуются в ожидании подтверждения ранее отправленных данных.
Действительно только для TCP: SocketImpl.
SO_BINDADDR
@Native static final int SO_BINDADDR
Получить привязку локального адреса сокета (этот параметр нельзя «установить», только «получить», так как сокеты привязываются во время создания, и поэтому локальный привязанный адрес изменить нельзя). По умолчанию локальный адрес сокета — INADDR_ANY, что означает любой локальный адрес на хосте с несколькими интерфейсами. Многоадресный хост может использовать этот параметр для приема подключений только к одному из своих адресов (в случае ServerSocket или DatagramSocket) или для указания адреса возврата к узлу-получателю (для Socket или DatagramSocket). Параметром этого параметра является InetAddress.
Этот параметр обязательно должен быть указан в конструкторе.
Действительно для: SocketImpl, DatagramSocketImpl
SO_REUSEADDR
@Native static final int SO_REUSEADDR
Устанавливает SO_REUSEADDR для сокета. Используется только для MulticastSockets в Java, и по умолчанию он установлен для MulticastSockets.
Действительно для: DatagramSocketImpl
- См. также:
- Значения постоянных полей
SO_REUSEPORT
@Native static final int SO_REUSEPORT
Устанавливает SO_REUSEPORT для сокета. Этот параметр включает и отключает возможность иметь несколько сокетов, прослушивающих один и тот же адрес и порт.
Действительно для: SocketImpl, DatagramSocketImpl
- С:
- 9
- См. также:
-
StandardSocketOptions.SO_REUSEPORT, Значения постоянных полей
SO_BROADCAST
@Native static final int SO_BROADCAST
Устанавливает SO_BROADCAST для сокета. Этот параметр включает и отключает возможность процесса отправлять широковещательные сообщения. Он поддерживается только для датаграммных сокетов и только в сетях, которые поддерживают понятие широковещательного сообщения (например, Ethernet, Token Ring и т.д.), и по умолчанию установлен для DatagramSockets.
- С:
- 1.4
- См. также:
- Значения постоянных полей
IP_MULTICAST_IF
@Native static final int IP_MULTICAST_IF
Установить интерфейс исходящего трафика для отправки мультикастовых пакетов. Полезно на хостах с несколькими сетевыми интерфейсами, когда приложения хотят использовать другой, чем системный по умолчанию. Принимает/возвращает InetAddress.
Действительно для мультикаста: DatagramSocketImpl
- См. также:
-
MulticastSocket.setInterface(InetAddress),MulticastSocket.getInterface(), Значения постоянных полей
IP_MULTICAST_IF2
@Native static final int IP_MULTICAST_IF2
То же, что и выше. Этот параметр введен, чтобы поведение с IP_MULTICAST_IF оставалось прежним, в то время как этот новый параметр может поддерживать установку исходящих интерфейсов с адресами IPv4 и IPv6. ПРИМЕЧАНИЕ: убедитесь, что нет конфликтов с этим
- С:
- 1.4
- См. также:
-
MulticastSocket.setNetworkInterface(NetworkInterface),MulticastSocket.getNetworkInterface(), Значения постоянных полей
IP_MULTICAST_LOOP
@Native static final int IP_MULTICAST_LOOP
Этот параметр включает или отключает локальную петлю обратной связи для мультикастовых датаграмм. Этот параметр включен по умолчанию для мультикастовых сокетов.
- С:
- 1.4
- См. также:
- Значения постоянных полей
IP_TOS
@Native static final int IP_TOS
Этот параметр устанавливает поле типа обслуживания или класса трафика в заголовке IP для TCP- или UDP-сокета.
- С:
- 1.4
- См. также:
- Значения постоянных полей
SO_LINGER
@Native static final int SO_LINGER
Указать таймаут ожидания при закрытии. Этот параметр отключает/включает немедленное возвращение из close() TCP-сокета. Включение этого параметра с ненулевым целым значением timeout означает, что close() будет блокироваться, ожидая передачи и подтверждения всех данных, отправленных узлу-получателю, после чего сокет закрывается корректно. По истечении таймаута ожидания сокет закрывается принудительно с TCP RST. Включение параметра с таймаутом 0 выполняет принудительное закрытие немедленно. Если указанное значение таймаута превышает 65 535, оно будет уменьшено до 65 535.
Действительно только для TCP: SocketImpl
SO_TIMEOUT
@Native static final int SO_TIMEOUT
Установить таймаут для блокирующих операций сокета:
ServerSocket.accept(); SocketInputStream.read(); DatagramSocket.receive();
Параметр должен быть установлен до начала блокирующей операции, чтобы он вступил в силу. Если таймаут истекает, а операция по-прежнему блокируется, возникает java.io.InterruptedIOException. Сокет в этом случае не закрывается.
Действительно для всех сокетов: SocketImpl, DatagramSocketImpl
- См. также:
-
Socket.setSoTimeout(int),ServerSocket.setSoTimeout(int),DatagramSocket.setSoTimeout(int), Значения постоянных полей
SO_SNDBUF
@Native static final int SO_SNDBUF
Установить предположительный размер буферов, используемых платформой для исходящих сетевых операций ввода-вывода. При использовании в set, это рекомендация ядру от приложения о размере буферов, используемых для данных, которые будут отправлены по сокету. При использовании в get, это должно вернуть размер буфера, фактически используемого платформой при отправке данных по этому сокету. Действительно для всех сокетов: SocketImpl, DatagramSocketImpl
- См. также:
-
Socket.setSendBufferSize(int),Socket.getSendBufferSize(),DatagramSocket.setSendBufferSize(int),DatagramSocket.getSendBufferSize(), Значения постоянных полей
SO_RCVBUF
@Native static final int SO_RCVBUF
Установить предположительный размер буферов, используемых платформой для входящих сетевых операций ввода-вывода. При использовании в set, это рекомендация ядру от приложения о размере буферов, используемых для данных, которые будут получены по сокету. При использовании в get, это должно вернуть размер буфера, фактически используемого платформой при получении данных по этому сокету. Действительно для всех сокетов: SocketImpl, DatagramSocketImpl
- См. также:
-
Socket.setReceiveBufferSize(int),Socket.getReceiveBufferSize(),DatagramSocket.setReceiveBufferSize(int),DatagramSocket.getReceiveBufferSize(), Значения постоянных полей
SO_KEEPALIVE
@Native static final int SO_KEEPALIVE
Когда параметр keepalive установлен для TCP-сокета, и никакие данные не обменивались по сокету ни в одном направлении в течение 2 часов (ПРИМЕЧАНИЕ: фактическое значение зависит от реализации), TCP автоматически отправляет запрос keepalive узлу-получателю. Этот запрос — TCP-сегмент, на который узел-получатель должен ответить. Ожидается один из трёх ответов: 1. Узел-получатель отвечает ожидаемым ACK. Приложение не уведомляется (поскольку всё в порядке). TCP отправит другой запрос после ещё 2 часов бездействия. 2. Узел-получатель отвечает RST, что сообщает локальному TCP о сбое и перезагрузке хоста-получателя. Сокет закрывается. 3. Нет ответа от узла-получателя. Сокет закрывается. Цель этого параметра — обнаружить сбой хоста-получателя. Действительно только для TCP-сокета: SocketImpl
SO_OOBINLINE
@Native static final int SO_OOBINLINE
Когда установлен параметр OOBINLINE, любые срочные TCP-данные, полученные по сокету, будут получены через поток ввода сокета. Когда параметр отключён (что является значением по умолчанию), срочные данные отбрасываются без уведомления.
Методы
setOption
void setOption(int optID,
Object value)
throws SocketException Включить/отключить параметр, заданный значением optID. Если параметр нужно включить, и он принимает специфическое значение, оно передаётся в value. Фактический тип значения зависит от параметра, и передача значения несоответствующего типа является ошибкой:
SocketImpl s;
...
s.setOption(SO_LINGER, new Integer(10));
// OK - set SO_LINGER w/ timeout of 10 sec.
s.setOption(SO_LINGER, new Double(10));
// ERROR - expects java.lang.Integer Если запрашиваемый параметр бинарный, он может быть установлен с помощью метода java.lang.Boolean: s.setOption(TCP_NODELAY, Boolean.TRUE);
// OK - enables TCP_NODELAY, a binary option Любой параметр может быть отключён с помощью этого метода со значением Boolean.FALSE:
s.setOption(TCP_NODELAY, Boolean.FALSE);
// OK - disables TCP_NODELAY
s.setOption(SO_LINGER, Boolean.FALSE);
// OK - disables SO_LINGER Для параметра, имеющего понятия включения и выключения, и требующего не-булевого параметра, установка значения, отличного от Boolean.FALSE, неявно включает его.
Выбрасывает SocketException, если параметр не распознан, сокет закрыт или произошла ошибка низкого уровня
- Параметры:
-
optID- идентифицирует параметр -
value- параметр сокета - Исключения:
-
SocketException- если параметр не распознан, сокет закрыт или произошла ошибка низкого уровня - См. также:
getOption(int)
getOption
Object getOption(int optID)
throws SocketException Получить значение параметра. Бинарные параметры вернут java.lang.Boolean.TRUE при включении и java.lang.Boolean.FALSE при отключении, например:
SocketImpl s;
...
Boolean noDelay = (Boolean)(s.getOption(TCP_NODELAY));
if (noDelay.booleanValue()) {
// true if TCP_NODELAY is enabled...
...
}
Для параметров, принимающих определённый тип в качестве параметра, getOption(int) вернёт значение параметра, иначе вернёт java.lang.Boolean.FALSE:
Object o = s.getOption(SO_LINGER);
if (o instanceof Integer) {
System.out.print("Linger time is " + ((Integer)o).intValue());
} else {
// the true type of o is java.lang.Boolean.FALSE;
}
- Параметры:
-
optID- идентификатор параметра для получения - Возвращает:
- значение параметра
- Исключения:
-
SocketException- если сокет закрыт -
SocketException- если optID неизвестен в стеке протоколов (включая SocketImpl) - См. также:
setOption(int, java.lang.Object)
© 1993, 2020, 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/11/docs/api/java.base/java/net/SocketOptions.html