Класс SctpMultiChannel
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable,Channel,InterruptibleChannel
public abstract class SctpMultiChannel extends AbstractSelectableChannel
Многоканальный SCTP поддерживает множество ассоциаций на одном сокете. SctpMultiChannel создается вызовом метода open этого класса. Новый канал открыт, но еще не привязан. Попытка вызвать метод receive на непривязанном канале вызовет исключение NotYetBoundException. Попытка вызвать метод send на непривязанном канале заставит его сначала вызвать метод bind. Адреса, к которым привязан сокет канала, можно получить, вызвав getAllLocalAddresses.
Сообщения могут быть отправлены и получены без явного установления ассоциации с удаленным узлом. Канал неявно установит новую ассоциацию всякий раз, когда он отправляет или получает сообщение от удаленного узла, если с этим узлом еще нет ассоциации. После успешного создания ассоциации уведомление association changed будет помещено в стек SCTP с параметром event, установленным на COMM_UP. Это уведомление можно получить, вызвав receive.
Параметры сокета настраиваются с помощью метода setOption. SctpMultiChannel поддерживает следующие параметры:
Дополнительные (специфичные для реализации) параметры также могут быть поддерживаемы. Список поддерживаемых параметров получается путем вызова метода
Название параметра Описание SCTP_DISABLE_FRAGMENTSВключает или отключает фрагментацию сообщений SCTP_EXPLICIT_COMPLETEВключает или отключает явную завершенность сообщения SCTP_FRAGMENT_INTERLEAVEУправляет тем, как происходит представление сообщений для получателя сообщений SCTP_INIT_MAXSTREAMSМаксимальное количество потоков, запрошенных локальным узлом во время инициализации ассоциации SCTP_NODELAYВключает или отключает алгоритм типа Nagle 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() |
Возвращает набор операций, определяющий поддерживаемые операции этого канала. |
Методы, объявленные в классе java.nio.channels.spi.AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Методы, объявленные в классе java.nio.channels.SelectableChannel
register
Методы, объявленные в классе java.nio.channels.spi.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 не применим и будет проигнорирован, если указан. Однако, если параметр специфичен для ассоциации, необходимо указать ассоциацию.
- Type Parameters:
T- Тип значения параметра сокета- Parameters:
-
name- Параметр сокета -
association- Ассоциация, для которой должен быть извлечён параметр, илиnull, если параметр должен быть извлечён на уровне сокета канала. - Returns:
- Значение параметра сокета. Значение
nullможет быть допустимым значением для некоторых параметров сокета. - Throws:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - See Also:
setOption
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, T value, Association association) throws IOException
Обратите внимание, что некоторые параметры извлекаются из сокета канала, поэтому параметр association не применим и будет проигнорирован, если указан. Однако, если параметр специфичен для ассоциации, необходимо указать ассоциацию.
- Type Parameters:
T- Тип значения параметра сокета- Parameters:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым значением для некоторых параметров сокета. -
association- Ассоциация, для которой должен быть установлен параметр, илиnull, если параметр должен быть установлен на уровне сокета канала. - Returns:
- Этот канал
- Throws:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
IllegalArgumentException- Если значение не является допустимым для этого параметра сокета -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - See Also:
supportedOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
Этот метод будет продолжать возвращать набор параметров даже после закрытия канала.
- Returns:
- Набор параметров сокета, поддерживаемых этим каналом
validOps
public final int validOps()
SCTP-мультиканалы поддерживают чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_READ | SelectionKey.OP_WRITE).
- Specified by:
-
validOpsв классеSelectableChannel - Returns:
- Набор допустимых операций
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.
- Type Parameters:
T- Тип вложения- Parameters:
-
buffer- Буфер, в который будут передаваться байты -
attachment- Объект, который необходимо прикрепить к операции получения; может бытьnull -
handler- Обработчик для обработки уведомлений от стека SCTP, илиnullдля игнорирования уведомлений. - Returns:
MessageInfo,null, если этот канал находится в режиме без блокировки, и сообщения немедленно недоступны, или если обработчик уведомлений возвращаетRETURNпосле обработки уведомления- Throws:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
NotYetBoundException- Если этот канал ещё не привязан -
IllegalReceiveException- Если предоставленный обработчик вызывает методreceiveэтого канала -
IOException- Если произошла другая ошибка ввода-вывода
Отправка
public abstract int send(ByteBuffer buffer, MessageInfo messageInfo) throws IOException
Если этот канал не привязан, то этот метод вызовет bind(null, 0) перед отправкой каких-либо данных.
Если между сокетом этого канала и предполагаемым получателем, идентифицируемым адресом в заданном messageInfo, нет установленного соединения, то оно будет автоматически установлено с предполагаемым получателем. Это считается неявным установлением соединения. После успешного установления соединения уведомление association changed будет помещено в стек SCTP с параметром event, установленным на COMM_UP. Это уведомление можно получить, вызвав receive.
Если этот канал находится в режиме блокировки, в базовом выходном буфере достаточно места, то оставшиеся байты в заданном буфере байтов передаются как одно сообщение. Отправка сообщения атомарна, если явное завершение сообщения SCTP_EXPLICIT_COMPLETE не включено в сокет этого канала.
Если этот канал находится в режиме неблокирующего режима, в базовом выходном буфере достаточно места, и необходимо неявное подключение, то оставшиеся байты в заданном буфере байтов передаются как одно сообщение, с учетом SCTP_EXPLICIT_COMPLETE. Если по какой-либо причине сообщение не может быть доставлено, уведомление association
changed помещается в стек SCTP с параметром event, установленным на CANT_START.
Сообщения передаются из буфера байтов так, как если бы это была обычная операция write.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию отправки в этом канале, то вызов этого метода будет заблокирован, пока первая операция не будет завершена.
- Параметры:
-
buffer- буфер, содержащий сообщение для отправки -
messageInfo- вспомогательные данные о сообщении для отправки - Возвращает:
- Количество отправленных байтов, которое будет либо количеством байтов, оставшихся в буфере сообщений при вызове этого метода, или, если этот канал неблокирующий, может быть нулем, если в базовом выходном буфере не было достаточно места для сообщения
- Исключения:
-
InvalidStreamException- ЕслиstreamNumberотрицательно, или если ассоциация уже существует иstreamNumberбольше максимального числа исходящих потоков -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
ветвь
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://download.java.net/java/early_access/jdk24/docs/api/jdk.sctp/com/sun/nio/sctp/SctpMultiChannel.html