Класс SctpMultiChannel
- Все реализуемые интерфейсы:
Closeable, AutoCloseable, Channel, InterruptibleChannel
public abstract class SctpMultiChannel extends AbstractSelectableChannel
Канал 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
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Set |
associations() |
Возвращает открытые ассоциации на сокете этого канала. |
final SctpMultiChannel |
bind |
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений. |
abstract SctpMultiChannel |
bind |
Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений. |
abstract SctpMultiChannel |
bindAddress |
Добавляет указанный адрес к привязанным адресам сокета канала. |
abstract SctpChannel |
branch |
Создает отдельный канал для ассоциации. |
abstract Set |
getAllLocalAddresses() |
Возвращает все адреса сокета, к которым привязан сокет этого канала. |
abstract <T> T |
getOption |
Возвращает значение параметра сокета. |
abstract Set |
getRemoteAddresses |
Возвращает все удаленные адреса, к которым подключена указанная ассоциация на сокете этого канала. |
static SctpMultiChannel |
open() |
Открывает канал SCTP для нескольких ассоциаций. |
abstract <T> MessageInfo |
receive |
Получает сообщение и/или обрабатывает уведомление через этот канал. |
abstract int |
send |
Отправляет сообщение через этот канал. |
abstract <T> SctpMultiChannel |
setOption |
Устанавливает значение параметра сокета. |
abstract SctpMultiChannel |
shutdown |
Завершает ассоциацию, не закрывая канал. |
abstract Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим каналом. |
abstract SctpMultiChannel |
unbindAddress |
Удаляет указанный адрес из привязанных адресов сокета канала. |
final int |
validOps() |
Возвращает набор операций, определяющий операции, поддерживаемые этим каналом. |
Методы, объявленные в классе AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Методы, объявленные в классе SelectableChannel
register
Методы, объявленные в классе AbstractInterruptibleChannel
begin, close, end, isOpen
Подробное описание конструкторов
SctpMultiChannel
protected SctpMultiChannel(SelectorProvider provider)
- Параметры:
-
provider— поставщик селектора для этого канала
Подробное описание методов
open
public static SctpMultiChannel open() throws IOException
Новый канал не привязан.
- Возвращает:
- Новый многоканальный канал 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— если произошла ошибка ввода-вывода - См. также:
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— если произошла ошибка ввода-вывода - См. также:
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— если произошла другая ошибка ввода-вывода
© 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://docs.oracle.com/en/java/javase/25/docs/api/jdk.sctp/com/sun/nio/sctp/SctpMultiChannel.html