Интерфейс SocketOptions
- Все известные реализующие классы:
- DatagramSocketImpl, SocketImpl
public interface SocketOptions
Интерфейс методов для получения/установки параметров сокета. Этот интерфейс реализован: SocketImpl и DatagramSocketImpl. Подклассы этих классов должны переопределять методы этого интерфейса, чтобы поддерживать свои собственные параметры.
Методы и константы, определяющие параметры в этом интерфейсе, предназначены только для реализации. Если вы не наследуете от SocketImpl или DatagramSocketImpl, вы не будете использовать их напрямую. Существуют безопасные по типу методы для получения/установки каждого из этих параметров в Socket, ServerSocket, DatagramSocket и MulticastSocket.
Поля
| Модификатор и тип | Поле и описание |
|---|---|
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_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_BROADCAST
@Native static final int SO_BROADCAST
Устанавливает SO_BROADCAST для сокета. Этот параметр включает и выключает возможность процесса отправлять широковещательные сообщения. Он поддерживается только для сокетов датаграмм и только в сетях, которые поддерживают понятие широковещательного сообщения (например, Ethernet, токен-кольцо и т. д.), и по умолчанию включен для DatagramSockets.
- С:
- 1.4
- См. также:
- Значения постоянных полей
IP_MULTICAST_IF
@Native static final int IP_MULTICAST_IF
Устанавливает исходящий интерфейс для отправки мультивещательных пакетов. Полезно на хостах с несколькими сетевыми интерфейсами, где приложения хотят использовать не системный интерфейс по умолчанию. Принимает/возвращает InetAddress.
Действительно для Multicast: 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 сокета. Включение этого параметра с ненулевым целочисленным таймаутом означает, что close() будет блокироваться до тех пор, пока не будет передано и подтверждено все данные, записанные в узел-партнер, после чего сокет закроется корректно. После достижения таймаута приостановки сокет закрывается принудительно с TCP RST. Включение параметра с таймаутом 0 выполняет принудительное закрытие немедленно. Если указанное значение таймаута превышает 65535, оно будет уменьшено до 65535.
Действительно только для 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, new Boolean(true));
// OK - enables TCP_NODELAY, a binary option Любой параметр можно отключить с помощью этого метода с Boolean(false):
s.setOption(TCP_NODELAY, new Boolean(false));
// OK - disables TCP_NODELAY
s.setOption(SO_LINGER, new 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- идентификаторintопции для получения - Возвращает:
- значение опции
- Исключения:
-
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.