Spec-Zone.ru › OpenJDK 27

Класс SctpMultiChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.SelectableChannel
java.nio.channels.spi.AbstractSelectableChannel
com.sun.nio.sctp.SctpMultiChannel
Все реализуемые интерфейсы:
Closeable, AutoCloseable, Channel, InterruptibleChannel
public abstract class SctpMultiChannel extends AbstractSelectableChannel
Выбираемый канал для SCTP-сокетов, ориентированных на сообщения.

Многопоточный канал SCTP поддерживает множество ассоциаций на одном сокете. SctpMultiChannel создается вызовом метода open этого класса. Созданный канал открыт, но еще не привязан. Попытка вызвать метод receive непривязанного канала приведет к выбрасыванию исключения NotYetBoundException. Попытка вызвать метод send непривязанного канала приведет к предварительному вызову метода bind. Адреса, к которым привязан сокет канала, можно получить вызовом метода getAllLocalAddresses.

Сообщения можно отправлять и получать без явной установки ассоциации с удаленным узлом. Канал неявно устанавливает новую ассоциацию при отправке или получении сообщения от удаленного узла, если ассоциация с этим узлом еще не установлена. После успешной установки ассоциации стеку SCTP будет передано уведомление association changed с параметром event, установленным в значение COMM_UP. Это уведомление можно получить вызовом метода receive.

Параметры сокета настраиваются с помощью метода setOption. SctpMultiChannel поддерживает следующие параметры:

Параметры сокета
Имя параметра Описание
SCTP_DISABLE_FRAGMENTS Включает или отключает фрагментацию сообщений
SCTP_EXPLICIT_COMPLETE Включает или отключает явное завершение сообщения
SCTP_FRAGMENT_INTERLEAVE Управляет порядком представления сообщений получателю
SCTP_INIT_MAXSTREAMS Максимальное число потоков, запрашиваемое локальной конечной точкой при инициализации ассоциации
SCTP_NODELAY Включает или отключает алгоритм, подобный алгоритму Нейгла
SCTP_PRIMARY_ADDR Запрашивает у локального стека SCTP использовать указанный адрес узла-партнера в качестве основного адреса ассоциации
SCTP_SET_PEER_PRIMARY_ADDR Запрашивает у узла-партнера установить указанный адрес в качестве основного адреса ассоциации
SO_SNDBUF Размер буфера отправки сокета
SO_RCVBUF Размер буфера приема сокета
SO_LINGER Ожидание при закрытии, если имеются данные (только в блокирующем режиме)
Также могут поддерживаться дополнительные параметры (зависящие от реализации). Список поддерживаемых параметров можно получить вызовом метода supportedOptions.

Многопоточные каналы SCTP безопасно использовать одновременно из нескольких потоков. Они поддерживают одновременную отправку и получение, однако в каждый момент времени отправлять может не более одного потока, а получать — не более одного потока.

С версии:
1.7

Краткое описание конструкторов

SctpMultiChannel(SelectorProvider provider)
Модификатор Конструктор Описание
protected
Инициализирует новый экземпляр этого класса.

Краткое описание методов

Модификатор и тип Метод Описание
abstract Set<Association> associations()
Возвращает открытые ассоциации на сокете этого канала.
final SctpMultiChannel bind(SocketAddress local)
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений.
abstract SctpMultiChannel bind(SocketAddress local, int backlog)
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений.
abstract SctpMultiChannel bindAddress(InetAddress address)
Добавляет указанный адрес к адресам, к которым привязан сокет канала.
abstract SctpChannel branch(Association association)
Создает отдельный канал для ассоциации.
abstract Set<SocketAddress> getAllLocalAddresses()
Возвращает все адреса сокета, к которым привязан сокет этого канала.
abstract <T> T getOption(SctpSocketOption<T> name, Association association)
Возвращает значение параметра сокета.
abstract Set<SocketAddress> getRemoteAddresses(Association association)
Возвращает все удаленные адреса, с которыми установлено соединение для указанной ассоциации на сокете этого канала.
static SctpMultiChannel open()
Открывает многопоточный канал SCTP.
abstract <T> MessageInfo receive(ByteBuffer buffer, T attachment, NotificationHandler<T> handler)
Получает сообщение и/или обрабатывает уведомление через этот канал.
abstract int send(ByteBuffer buffer, MessageInfo messageInfo)
Отправляет сообщение через этот канал.
abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, T value, Association association)
Устанавливает значение параметра сокета.
abstract SctpMultiChannel shutdown(Association association)
Завершает ассоциацию, не закрывая канал.
abstract Set<SctpSocketOption<?>> supportedOptions()
Возвращает набор параметров сокета, поддерживаемых этим каналом.
abstract SctpMultiChannel unbindAddress(InetAddress address)
Удаляет указанный адрес из адресов, к которым привязан сокет канала.
final int validOps()
Возвращает набор операций, поддерживаемых этим каналом.

Методы, объявленные в классе AbstractSelectableChannel

blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Модификатор и тип Метод Описание
final Object blockingLock()
Возвращает объект, на котором синхронизируются методы configureBlocking и register.
final SelectableChannel configureBlocking(boolean block)
Изменяет режим блокировки этого канала.
protected final void implCloseChannel()
Закрывает этот канал.
protected abstract void implCloseSelectableChannel()
Закрывает этот выбираемый канал.
protected abstract void implConfigureBlocking(boolean block)
Изменяет режим блокировки этого канала.
final boolean isBlocking()
Определяет, будут ли все операции ввода-вывода в этом канале блокироваться до их завершения.
final boolean isRegistered()
Определяет, зарегистрирован ли этот канал в данный момент в каких-либо селекторах.
final SelectionKey keyFor(Selector sel)
Возвращает ключ, представляющий регистрацию канала в указанном селекторе.
final SelectorProvider provider()
Возвращает поставщика, создавшего этот канал.
final SelectionKey register(Selector sel, int ops, Object att)
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.

Методы, объявленные в классе SelectableChannel

register
Модификатор и тип Метод Описание
final SelectionKey register(Selector sel, int ops)
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора.

Методы, объявленные в классе AbstractInterruptibleChannel

begin, close, end, isOpen
Модификатор и тип Метод Описание
protected final void begin()
Отмечает начало операции ввода-вывода, которая может заблокироваться на неопределенное время.
final void close()
Закрывает этот канал.
protected final void end(boolean completed)
Отмечает завершение операции ввода-вывода, которая может заблокироваться на неопределенное время.
final boolean isOpen()
Определяет, открыт ли этот канал.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Определяет, равен ли этот объект какому-либо другому объекту.
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(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного времени.

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

SctpMultiChannel

protected SctpMultiChannel(SelectorProvider provider)
Инициализирует новый экземпляр этого класса.
Параметры:
provider — поставщик селекторов для этого канала

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

open

public static SctpMultiChannel open() throws IOException
Открывает многоканальный SCTP-канал.

Новый канал не привязан.

Возвращает:
Новый многоканальный SCTP-канал
Выбрасывает:
UnsupportedOperationException — если протокол SCTP не поддерживается
IOException — если произошла ошибка ввода-вывода

associations

public abstract Set<Association> associations() throws IOException
Возвращает открытые ассоциации в сокете этого канала.

В возвращаемый набор ассоциаций включаются только те ассоциации, для которых получено событие изменения ассоциации COMM_UP. Ассоциации, для которых получено событие изменения ассоциации COMM_LOST или SHUTDOWN, удаляются из набора ассоциаций.

Возвращаемый набор ассоциаций представляет собой снимок открытых ассоциаций на момент вызова этого метода.

Возвращает:
Set, содержащий открытые ассоциации, или пустой Set, если их нет.
Выбрасывает:
ClosedChannelException — если этот канал закрыт
IOException — если произошла другая ошибка ввода-вывода

bind

public abstract SctpMultiChannel bind(SocketAddress local, int backlog) throws IOException
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений.

Этот метод устанавливает связь между сокетом и локальным адресом. После установления связи сокет остается привязанным до закрытия канала. Эта связь не обязательно должна существовать с адресом local, поскольку он может быть удален с помощью unbindAddress, однако после успешного завершения вызова этого метода к сокету канала всегда будет привязан как минимум один локальный адрес.

После успешной привязки сокета канала к определенному адресу, если этот адрес не был назначен автоматически, к нему можно привязать дополнительные адреса с помощью bindAddress или удалить их с помощью unbindAddress.

Параметр backlog задает максимальное количество ожидающих соединений на сокете. Его точная семантика зависит от реализации. Реализация может устанавливать собственное максимальное значение или игнорировать этот параметр. Если значение параметра backlog равно 0 или является отрицательным, используется значение по умолчанию, определяемое реализацией.

Параметры:
local — локальный адрес для привязки сокета или null для привязки сокета к автоматически назначенному адресу сокета
backlog — максимальное количество ожидающих соединений
Возвращает:
Этот канал
Выбрасывает:
ClosedChannelException — если этот канал закрыт
AlreadyBoundException — если этот канал уже привязан
UnsupportedAddressTypeException — если тип указанного адреса не поддерживается
IOException — если произошла другая ошибка ввода-вывода

bind

public final SctpMultiChannel bind(SocketAddress local) throws IOException
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений.

Этот метод работает так, как если бы его вызов был эквивалентен вычислению выражения:

bind(local, 0);
Параметры:
local — локальный адрес для привязки сокета или null для привязки сокета к автоматически назначенному адресу сокета
Возвращает:
Этот канал
Выбрасывает:
ClosedChannelException — если этот канал закрыт
AlreadyBoundException — если этот канал уже привязан
UnsupportedAddressTypeException — если тип указанного адреса не поддерживается
IOException — если произошла другая ошибка ввода-вывода

bindAddress

public abstract SctpMultiChannel bindAddress(InetAddress address) throws IOException
Добавляет указанный адрес к адресам, привязанным к сокету канала.

Указанный адрес не должен быть адресом wildcard. Перед вызовом этого метода канал необходимо привязать с помощью bind, иначе будет выброшено исключение NotYetBoundException. Метод bind принимает аргумент типа SocketAddress, который обычно содержит номер порта и адрес. Адреса, привязанные впоследствии с помощью этого метода, являются просто адресами, поскольку номер порта SCTP остается неизменным в течение всего срока существования канала.

Новые ассоциации, установленные после успешного завершения этого метода, будут связаны с указанным адресом. Добавление адресов к существующим ассоциациям является необязательной функцией. Если конечная точка поддерживает динамическую перенастройку адресов, она может отправить узлу-пиру соответствующее сообщение для изменения списков адресов пира.

Параметры:
address — адрес, добавляемый к адресам, привязанным к сокету
Возвращает:
Этот канал
Выбрасывает:
ClosedChannelException — если этот канал закрыт
NotYetBoundException — если этот канал еще не привязан
AlreadyBoundException — если этот канал уже привязан к указанному адресу
IllegalArgumentException — если адрес равен null или является адресом wildcard
IOException — если произошла другая ошибка ввода-вывода

unbindAddress

public abstract SctpMultiChannel unbindAddress(InetAddress address) throws IOException
Удаляет указанный адрес из адресов, привязанных к сокету канала.

Указанный адрес не должен быть адресом wildcard. Перед вызовом этого метода канал необходимо привязать с помощью bind, иначе будет выброшено исключение NotYetBoundException.

Если этот метод вызван для канала, у которого address не является одним из привязанных адресов или к которому привязан только один локальный адрес, метод выбрасывает исключение IllegalUnbindException.

Исходный адрес, к которому сокет канала привязан с помощью bind, можно удалить из адресов, привязанных к сокету канала.

Новые ассоциации, установленные после успешного завершения этого метода, не будут связаны с указанным адресом. Удаление адресов из существующих ассоциаций является необязательной функцией. Если конечная точка поддерживает динамическую перенастройку адресов, она может отправить узлу-пиру соответствующее сообщение для изменения списков адресов пира.

Параметры:
address — адрес, удаляемый из адресов, привязанных к сокету
Возвращает:
Этот канал
Выбрасывает:
ClosedChannelException — если этот канал закрыт
NotYetBoundException — если этот канал еще не привязан
IllegalUnbindException — address не привязан к сокету канала или к каналу привязан только один адрес
IllegalArgumentException — если адрес равен null или является адресом wildcard
IOException — если произошла другая ошибка ввода-вывода

getAllLocalAddresses

public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
Возвращает все адреса сокетов, к которым привязан сокет этого канала.
Возвращает:
Все адреса сокетов, к которым привязан сокет этого канала, или пустой Set, если сокет канала не привязан
Выбрасывает:
ClosedChannelException — если канал закрыт
IOException — если произошла ошибка ввода-вывода

getRemoteAddresses

public abstract Set<SocketAddress> getRemoteAddresses(Association association) throws IOException
Возвращает все удаленные адреса, к которым подключена указанная ассоциация в сокете этого канала.
Параметры:
association — ассоциация
Возвращает:
Все удаленные адреса указанной ассоциации или пустой Set, если ассоциация была остановлена
Выбрасывает:
ClosedChannelException — если канал закрыт
IOException — если произошла ошибка ввода-вывода

shutdown

public abstract SctpMultiChannel shutdown(Association association) throws IOException
Завершает работу ассоциации, не закрывая канал.
Параметры:
association — ассоциация, работу которой нужно завершить
Возвращает:
Этот канал
Выбрасывает:
ClosedChannelException — если этот канал закрыт
IOException — если произошла другая ошибка ввода-вывода

getOption

public abstract <T> T getOption(SctpSocketOption<T> name, Association association) throws IOException
Возвращает значение параметра сокета.

Обратите внимание: некоторые параметры считываются из сокета канала, поэтому параметр association неприменим и будет проигнорирован, если он указан. Однако для параметров, относящихся к ассоциации, необходимо указать ассоциацию.

Параметры типа:
T — тип значения параметра сокета
Параметры:
name — параметр сокета
association — ассоциация, параметр которой необходимо получить, или null, если этот параметр необходимо получить на уровне сокета канала.
Возвращает:
Значение параметра сокета. Для некоторых параметров сокета значение null может быть допустимым.
Выбрасывает:
UnsupportedOperationException — если этот канал не поддерживает параметр сокета
ClosedChannelException — если этот канал закрыт
IOException — если произошла ошибка ввода-вывода
См. также:
  • SctpStandardSocketOptions

setOption

public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, T value, Association association) throws IOException
Устанавливает значение параметра сокета.

Обратите внимание: некоторые параметры считываются из сокета канала, поэтому параметр association неприменим и будет проигнорирован, если он указан. Однако для параметров, относящихся к ассоциации, необходимо указать ассоциацию.

Параметры типа:
T — тип значения параметра сокета
Параметры:
name — параметр сокета
value — значение параметра сокета. Для некоторых параметров сокета значение null может быть допустимым.
association — ассоциация, для которой необходимо установить параметр, или null, если этот параметр необходимо установить на уровне сокета канала.
Возвращает:
Этот канал
Выбрасывает:
UnsupportedOperationException — если этот канал не поддерживает параметр сокета
IllegalArgumentException — если значение недопустимо для этого параметра сокета
ClosedChannelException — если этот канал закрыт
IOException — если произошла ошибка ввода-вывода
См. также:
  • SctpStandardSocketOptions

supportedOptions

public abstract Set<SctpSocketOption<?>> supportedOptions()
Возвращает набор параметров сокета, поддерживаемых этим каналом.

Этот метод продолжает возвращать набор параметров, даже если канал закрыт.

Возвращает:
Набор параметров сокета, поддерживаемых этим каналом

validOps

public final int validOps()
Возвращает набор операций, определяющий операции, поддерживаемые этим каналом.

Многоканальные SCTP-каналы поддерживают чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_READ | SelectionKey.OP_WRITE).

Определено в:
validOps в классе SelectableChannel
Возвращает:
Набор допустимых операций

receive

public abstract <T> MessageInfo receive(ByteBuffer buffer, T attachment, NotificationHandler<T> handler) throws IOException
Получает сообщение и/или обрабатывает уведомление через этот канал.

Если сообщение или уведомление доступно немедленно либо если этот канал работает в блокирующем режиме и сообщение или уведомление в конечном итоге становится доступно, сообщение возвращается или уведомление обрабатывается соответственно. Если этот канал работает в неблокирующем режиме и сообщение или уведомление недоступно немедленно, этот метод сразу возвращает null.

Если этот метод получает сообщение, оно копируется в указанный байтовый буфер, и возвращается объект MessageInfo. Сообщение переносится в указанный байтовый буфер, начиная с его текущей позиции, а позиция буфера увеличивается на количество прочитанных байтов. Если в буфере осталось меньше байтов, чем требуется для хранения сообщения, или нижележащий входной буфер не содержит сообщения целиком, вызов isComplete для возвращенного MessageInfo вернет false, и для полного получения сообщения потребуются дополнительные вызовы этого метода. В каждом потоке одновременно может быть частично доставлено только одно сообщение. Параметр сокета SCTP_FRAGMENT_INTERLEAVE управляет различными аспектами чередования сообщений.

Если этот метод получает уведомление, вызывается соответствующий метод указанного обработчика, если он задан. Если обработчик возвращает CONTINUE, этот метод попытается получить следующее сообщение или уведомление; если же он возвращает RETURN, этот метод вернет null. Неперехваченное исключение, выброшенное обработчиком, передается вверх по стеку через этот метод.

Этот метод можно вызывать в любое время. Если другой поток уже начал операцию получения данных в этом канале, вызов этого метода будет блокироваться до завершения первой операции. Указанный обработчик вызывается без удержания блокировок, используемых для обеспечения описанной выше синхронизации, поэтому обработчики не будут препятствовать получению данных другими потоками. Обработчику не следует вызывать метод receive этого канала; в противном случае будет выброшено исключение IllegalReceiveException.

Параметры типа:
T — тип вложенного объекта
Параметры:
buffer — буфер, в который будут перенесены байты
attachment — объект, присоединяемый к операции получения данных; может быть равен null
handler — обработчик уведомлений от стека SCTP или null, чтобы игнорировать все уведомления.
Возвращает:
Объект MessageInfo, null, если этот канал работает в неблокирующем режиме и сообщения немедленно недоступны, или если обработчик уведомлений возвращает RETURN после обработки уведомления
Выбрасывает:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NotYetBoundException — если этот канал еще не привязан
IllegalReceiveException — если указанный обработчик вызывает метод receive этого канала
IOException — если произошла другая ошибка ввода-вывода

send

public abstract int send(ByteBuffer buffer, MessageInfo messageInfo) throws IOException
Отправляет сообщение через этот канал.

Если этот канал не привязан, перед отправкой данных этот метод вызывает bind(null, 0).

Если между сокетом этого канала и предполагаемым получателем, определяемым адресом в указанном messageInfo, еще нет ассоциации, она будет автоматически установлена с предполагаемым получателем. Это называется неявным установлением ассоциации. После успешного установления ассоциации в стек SCTP будет помещено уведомление association changed, параметр event которого будет иметь значение COMM_UP. Это уведомление можно получить, вызвав receive.

Если этот канал работает в блокирующем режиме и в нижележащем выходном буфере достаточно места, оставшиеся байты указанного байтового буфера передаются как одно сообщение. Отправка сообщения является атомарной, если на сокете этого канала не включен параметр сокета явного завершения сообщения SCTP_EXPLICIT_COMPLETE.

Если этот канал работает в неблокирующем режиме, в нижележащем выходном буфере достаточно места и требуется неявное установление ассоциации, оставшиеся байты указанного байтового буфера передаются как одно сообщение с учетом параметра SCTP_EXPLICIT_COMPLETE. Если по какой-либо причине сообщение не может быть доставлено, в стек SCTP помещается уведомление association changed, параметр event которого будет иметь значение CANT_START.

Сообщение переносится из байтового буфера так же, как при обычной операции write.

Этот метод можно вызывать в любое время. Если другой поток уже начал операцию отправки в этом канале, вызов этого метода будет блокироваться до завершения первой операции.

Параметры:
buffer — буфер, содержащий отправляемое сообщение
messageInfo — дополнительные данные об отправляемом сообщении
Возвращает:
Количество отправленных байтов. Оно будет равно количеству байтов, оставшихся в буфере сообщения на момент вызова этого метода, либо, если канал работает в неблокирующем режиме, может быть равно нулю, если в нижележащем выходном буфере недостаточно места для сообщения
Выбрасывает:
InvalidStreamException — если streamNumber отрицательно или если ассоциация уже существует и streamNumber превышает максимальное количество исходящих потоков
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException — если произошла другая ошибка ввода-вывода

branch

public abstract SctpChannel branch(Association association) throws IOException
Выделяет ассоциацию в отдельный канал.

Приложение может вызвать этот метод, чтобы выделить ассоциацию в отдельный канал. Для этой ассоциации будет создан новый привязанный и подключенный SctpChannel. Выделенная ассоциация больше не будет частью этого канала.

Это особенно полезно, например, если приложение хочет оставить несколько источников или получателей редких сообщений в исходном многоканальном SCTP-канале, а ассоциации, передающие большой объем данных, выделить в отдельные SCTP-каналы.

Параметры:
association — ассоциация, которую необходимо выделить
Возвращает:
SctpChannel
Выбрасывает:
ClosedChannelException — если этот канал закрыт
IOException — если произошла другая ошибка ввода-вывода

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

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