Класс SctpChannel
- Все реализуемые интерфейсы:
-
Closeable,AutoCloseable,Channel,InterruptibleChannel
public abstract class SctpChannel extends AbstractSelectableChannel
Канал SCTP может контролировать только одну ассоциацию SCTP. SCTPChannel создается путем вызова одного из методов open этого класса. Недавно созданный канал открыт, но еще не подключен, то есть нет настройки ассоциации с удаленным узлом. Попытка вызвать операцию ввода-вывода на отключенном канале приведет к тому, что будет брошен NotYetConnectedException. Установку ассоциации можно выполнить, подключив канал с помощью одного из его методов connect. После подключения канал остается подключенным до тех пор, пока он не будет закрыт. Подключен ли канал или нет, можно определить, вызвав getRemoteAddresses.
Каналы SCTP поддерживают неблокирующее подключение: Канал может быть создан, и процесс установления связи с удаленным сокетом может быть инициирован с помощью метода connect для последующего завершения методом finishConnect. Процесс подключения в данный момент можно определить, вызвав метод isConnectionPending.
Параметры сокета настраиваются с помощью метода setOption. Канал SCTP поддерживает следующие параметры:
Дополнительные (специфичные для реализации) параметры также могут быть поддерживаемы. Список поддерживаемых параметров можно получить, вызвав метод
Имя параметра Описание 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 безопасны для использования несколькими потоками одновременно. Они поддерживают одновременный чтение и запись, хотя в любой момент времени может быть только один поток на чтение и один поток на запись. Методы connect и finishConnect взаимно синхронизированы, и попытка инициировать операцию отправки или приема в то время, когда один из этих методов выполняется, приведет к блокировке, пока этот вызов не будет завершен.
- С тех пор как:
- 1.7
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Association |
association() |
Возвращает ассоциацию на сокете этого канала. |
abstract SctpChannel |
bind |
Связывает сокет канала с локальным адресом. |
abstract SctpChannel |
bindAddress |
Добавляет указанный адрес к связанным адресам для сокета канала. |
abstract boolean |
connect |
Подключает сокет этого канала. |
abstract boolean |
connect |
Подключает сокет этого канала. |
abstract boolean |
finishConnect() |
Завершает процесс подключения канала SCTP. |
abstract Set |
getAllLocalAddresses() |
Возвращает все адреса сокета, к которым подключен сокет этого канала. |
abstract <T> T |
getOption |
Возвращает значение параметра сокета. |
abstract Set |
getRemoteAddresses() |
Возвращает все удаленные адреса, к которым подключен сокет этого канала. |
abstract boolean |
isConnectionPending() |
Указывает, идет ли в настоящее время операция подключения на этом канале. |
static SctpChannel |
open() |
Открывает канал SCTP. |
static SctpChannel |
open |
Открывает канал SCTP и подключает его к удаленному адресу. |
abstract <T> MessageInfo |
receive |
Принимает сообщение в указанный буфер и/или обрабатывает уведомление. |
abstract int |
send |
Отправляет сообщение через этот канал. |
abstract <T> SctpChannel |
setOption |
Устанавливает значение параметра сокета. |
abstract SctpChannel |
shutdown() |
Закрывает подключение без закрытия канала. |
abstract Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим каналом. |
abstract SctpChannel |
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
Подробное описание конструкторов
SctpChannel
protected SctpChannel(SelectorProvider provider)
- Параметры:
-
provider- поставщик селектора для этого канала
Подробное описание методов
open
public static SctpChannel open() throws IOException
Новый канал не привязан и не подключен.
- Возвращает:
- Новый SCTP канал
- Исключения:
-
UnsupportedOperationException- Если протокол SCTP не поддерживается -
IOException- Если произошла ошибка ввода-вывода
open
public static SctpChannel open(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException
Это удобный метод, эквивалентный следующему выражению:
open().connect(remote, maxOutStreams, maxInStreams);
- Параметры:
-
remote- удалённый адрес, к которому должен быть подключен новый канал -
maxOutStreams- количество потоков, которые приложение хочет отправлять. Должно быть неотрицательным и не больше65536.0для использования значения по умолчанию конечной точки. -
maxInStreams- максимальное количество входящих потоков, которые приложение готово поддерживать. Должно быть неотрицательным и не больше65536.0для использования значения по умолчанию конечной точки. - Возвращает:
- Новый SCTP канал, подключенный к заданному адресу
- Исключения:
-
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции подключения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
UnresolvedAddressException- Если заданный удалённый адрес не полностью разрешен -
UnsupportedAddressTypeException- Если тип заданного удалённого адреса не поддерживается -
UnsupportedOperationException- Если протокол SCTP не поддерживается -
IOException- Если произошла другая ошибка ввода-вывода
association
public abstract Association association() throws IOException
- Возвращает:
- ассоциацию или
null, если сокет канала не подключён. - Исключения:
-
ClosedChannelException- Если канал закрыт -
IOException- Если произошла другая ошибка ввода-вывода
bind
public abstract SctpChannel bind(SocketAddress local) throws IOException
Этот метод используется для установления связи между сокетом и локальными адресами. После установления связи сокет остаётся привязанным до закрытия канала. Эта связь необязательно происходит с адресом local, поскольку она может быть удалена с помощью unbindAddress, но всегда будет по крайней мере один локальный адрес, привязанный к сокету канала после успешного завершения вызова этого метода.
После успешной привязки сокета канала к конкретному адресу, который не назначается автоматически, к нему могут быть привязаны дополнительные адреса с помощью bindAddress или удалены с помощью unbindAddress.
- Параметры:
-
local- локальный адрес для привязки сокета илиnullдля привязки сокета к автоматически назначенному адресу сокета - Возвращает:
- Этот канал
- Исключения:
-
AlreadyConnectedException- Если этот канал уже подключён -
ClosedChannelException- Если этот канал закрыт -
ConnectionPendingException- Если в этом канале уже выполняется операция подключения в неблокирующем режиме -
AlreadyBoundException- Если этот канал уже привязан -
UnsupportedAddressTypeException- Если тип заданного адреса не поддерживается -
IOException- Если произошла другая ошибка ввода-вывода
bindAddress
public abstract SctpChannel bindAddress(InetAddress address) throws IOException
Заданный адрес не должен быть адресом wildcard. Канал должен быть сначала привязан с помощью bind перед вызовом этого метода, в противном случае выбрасывается NotYetBoundException. Метод bind принимает SocketAddress в качестве аргумента, который обычно содержит номер порта и адрес. Адреса, привязанные впоследствии с помощью этого метода, являются просто адресами, поскольку номер порта SCTP остаётся неизменным в течение всего срока службы канала.
Добавление адресов к подключённой ассоциации является необязательной функциональностью. Если конечная точка поддерживает динамическую переконфигурацию адресов, она может отправить соответствующее сообщение партнёру, чтобы изменить списки адресов партнёра.
- Параметры:
-
address- адрес для добавления к привязанным адресам сокета - Возвращает:
- Этот канал
- Исключения:
-
ClosedChannelException- Если этот канал закрыт -
ConnectionPendingException- Если в этом канале уже выполняется операция подключения в неблокирующем режиме -
NotYetBoundException- Если этот канал ещё не привязан -
AlreadyBoundException- Если этот канал уже привязан к указанному адресу -
IllegalArgumentException- Если адрес являетсяnullили адресомwildcard -
IOException- Если произошла другая ошибка ввода-вывода
unbindAddress
public abstract SctpChannel unbindAddress(InetAddress address) throws IOException
Заданный адрес не должен быть адресом wildcard. Канал должен быть сначала привязан с помощью bind перед вызовом этого метода, в противном случае выбрасывается NotYetBoundException. Если этот метод вызван для канала, у которого address не является одним из привязанных адресов, или у которого привязан только один локальный адрес, то этот метод выбрасывает IllegalUnbindException. Изначальный адрес, к которому привязан сокет канала с помощью bind, может быть удалён из привязанных адресов сокета канала.
Удаление адресов из подключённой ассоциации является необязательной функциональностью. Если конечная точка поддерживает динамическую переконфигурацию адресов, она может отправить соответствующее сообщение партнёру, чтобы изменить списки адресов партнёра.
- Параметры:
-
address- адрес для удаления из привязанных адресов сокета - Возвращает:
- Этот канал
- Исключения:
-
ClosedChannelException- Если этот канал закрыт -
ConnectionPendingException- Если в этом канале уже выполняется операция подключения в неблокирующем режиме -
NotYetBoundException- Если этот канал ещё не привязан -
IllegalArgumentException- Если адрес являетсяnullили адресомwildcard -
IllegalUnbindException- Еслиaddressне привязан к сокету канала или канал имеет только один привязанный адрес -
IOException- Если произошла другая ошибка ввода-вывода
connect
public abstract boolean connect(SocketAddress remote) throws IOException
Если этот канал находится в режиме без ожидания, вызов этого метода инициирует операцию подключения без ожидания. Если подключение установлено немедленно, как может произойти при локальном подключении, то этот метод возвращает true. В противном случае этот метод возвращает false, и операция подключения должна быть завершена позже вызовом метода finishConnect.
Если этот канал находится в режиме ожидания, вызов этого метода будет блокировать выполнение до тех пор, пока подключение не будет установлено или не произойдёт ошибка ввода-вывода.
Этот метод может быть вызван в любое время. Если операция send или receive на этом канале вызывается во время выполнения этого метода, то эта операция сначала заблокируется до завершения вызова. Если попытка подключения начата, но не удалась, то есть, если вызов этого метода выбрасывает проверочное исключение, то канал будет закрыт.
- Parameters:
-
remote- Удаленный узел, к которому должен быть подключен этот канал - Returns:
-
true, если подключение было установлено,false, если этот канал находится в режиме без ожидания, и операция подключения находится в процессе выполнения - Throws:
-
AlreadyConnectedException- Если этот канал уже подключен -
ConnectionPendingException- Если операция подключения без ожидания уже выполняется на этом канале -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции подключения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока -
UnresolvedAddressException- Если заданный удалённый адрес не полностью разрешен -
UnsupportedAddressTypeException- Если тип заданного удалённого адреса не поддерживается -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
connect
public abstract boolean connect(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException
Это вспомогательный метод, эквивалентный вычислению следующего выражения:
setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams)) .connect(remote);
Параметры maxOutStreams и maxInStreams представляют максимальное количество потоков, которое приложение хочет иметь возможность отправлять и получать. Они согласовываются с удалённым узлом и могут быть ограничены операционной системой.
- Parameters:
-
remote- Удаленный узел, к которому должен быть подключен этот канал -
maxOutStreams- Должен быть неотрицательным и не больше65536.0для использования значения по умолчанию конечной точки. -
maxInStreams- Должен быть неотрицательным и не больше65536.0для использования значения по умолчанию конечной точки. - Returns:
-
true, если подключение было установлено,false, если этот канал находится в режиме без ожидания, и операция подключения находится в процессе выполнения - Throws:
-
AlreadyConnectedException- Если этот канал уже подключен -
ConnectionPendingException- Если операция подключения без ожидания уже выполняется на этом канале -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции подключения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока -
UnresolvedAddressException- Если заданный удалённый адрес не полностью разрешен -
UnsupportedAddressTypeException- Если тип заданного удалённого адреса не поддерживается -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
isConnectionPending
public abstract boolean isConnectionPending()
- Returns:
-
true, если и только если операция подключения была инициирована на этом канале, но ещё не завершена вызовом методаfinishConnect()
finishConnect
public abstract boolean finishConnect() throws IOException
Операция подключения без ожидания инициируется путем перевода сокета канала в режим без ожидания, а затем вызова одного из его методов connect. После того, как подключение установлено или попытка завершена, канал становится подключаемым, и этот метод может быть вызван для завершения последовательности подключения. Если операция подключения завершилась неудачей, вызов этого метода вызовет соответствующее исключение IOException.
Если этот канал уже подключен, этот метод не будет блокировать и сразу вернёт true. Если этот канал находится в режиме без ожидания, этот метод вернёт false, если процесс подключения ещё не завершён. Если этот канал находится в режиме ожидания, этот метод будет блокировать выполнение до завершения или неудачи подключения, и всегда вернёт true или выбросит исключение, описывающее ошибку.
Этот метод может быть вызван в любое время. Если операция send или receive на этом канале вызывается во время выполнения этого метода, то эта операция сначала заблокируется до завершения вызова. Если попытка подключения завершается неудачей, то есть, если вызов этого метода выбрасывает проверочное исключение, то канал будет закрыт.
- Returns:
-
true, если сокет этого канала теперь подключён - Throws:
-
NoConnectionPendingException- Если этот канал не подключён и операция подключения не была инициирована -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции подключения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
getAllLocalAddresses
public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
- Returns:
- Все адреса сокетов, к которым подключён сокет этого канала, или пустой
Set, если сокет канала не подключён - Throws:
-
ClosedChannelException- Если канал закрыт -
IOException- Если произошла ошибка ввода-вывода
getRemoteAddresses
public abstract Set<SocketAddress> getRemoteAddresses() throws IOException
Если канал подключён к удалённому узлу, привязанному к нескольким адресам, то это эти адреса, к которым подключён сокет канала.
- Returns:
- Все удалённые адреса, к которым подключён сокет этого канала, или пустой
Set, если сокет канала не подключён - Throws:
-
ClosedChannelException- Если канал закрыт -
IOException- Если произошла ошибка ввода-вывода
shutdown
public abstract SctpChannel shutdown() throws IOException
Отправляет команду отключения удалённому узлу, фактически предотвращая отправку новых данных в сокет ни одним из узлов. Дальнейшие отправки приведут к исключению ClosedChannelException. Канал остаётся открытым, чтобы получить любые данные (и уведомления), которые могли быть отправлены узлом до того, как он получил команду отключения. Если канал уже отключен, вызов этого метода не оказывает никакого влияния.
- Returns:
- Этот канал
- Throws:
-
NotYetConnectedException- Если этот канал ещё не подключен -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
getOption
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException
- Type Parameters:
T- Тип значения параметра сокета- Parameters:
-
name- Параметр сокета - Returns:
- Значение параметра сокета. Значение
nullможет быть допустимым значением для некоторых параметров сокета. - Throws:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - See Also:
setOption
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) throws IOException
- Type Parameters:
T- Тип значения параметра сокета- Parameters:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров сокета. - Returns:
- Этот канал
- Throws:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
IllegalArgumentException- Если значение не является допустимым значением для этого параметра сокета -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - See Also:
supportedOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
Этот метод будет продолжать возвращать набор параметров даже после закрытия канала.
- Returns:
- Набор параметров сокета, поддерживаемых этим каналом
validOps
public final int validOps()
Каналы SCTP поддерживают подключение, чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE).
- Specified by:
-
validOpsв классеSelectableChannel - Returns:
- Набор допустимых операций
receive
public abstract <T> MessageInfo receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler) throws IOException
Если сообщение или уведомление сразу доступно, или если этот канал в режиме блокировки и одно из них в конечном итоге становится доступным, то сообщение или уведомление соответственно возвращаются или обрабатываются. Если этот канал в режиме без блокировки, и сообщение или уведомление не доступны сразу, то этот метод сразу возвращает null.
Если этот метод получает сообщение, то оно копируется в заданный байтовый буфер. Сообщение переносится в заданный байтовый буфер, начиная с текущей позиции, и позиция буфера увеличивается на количество прочитанных байт. Если оставшихся байт в буфере меньше, чем требуется для хранения сообщения, или основной буфер ввода не содержит полное сообщение, то вызов isComplete на возвращённом
MessageInfo вернёт false, и для полного потребления сообщения потребуется больше вызовов этого метода. В любом потоке будет частично передано только одно сообщение за раз. Параметр сокета SCTP_FRAGMENT_INTERLEAVE управляет различными аспектами того, как происходит чередование сообщений.
Если этот метод получает уведомление, то вызывается соответствующий метод заданного обработчика, если он есть. Если обработчик возвращает CONTINUE, то этот метод попытается получить другое сообщение/уведомление, в противном случае, если возвращается RETURN, этот метод вернёт
null. Если обработчик генерирует необработанное исключение, оно будет распространено вверх по стеку через этот метод.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию получения на этом канале, то вызов этого метода будет блокироваться до завершения первой операции. Заданный обработчик вызывается без удержания каких-либо блокировок, используемых для обеспечения политики синхронизации, указанной выше, таким образом, обработчики не будут блокировать другие потоки от получения. Обработчик не должен вызывать метод receive этого канала, если он это сделает, будет выброшено IllegalReceiveException.
- Type Parameters:
T- Тип вложения- Parameters:
-
dst- Буфер, в который будут передаваться байты сообщения -
attachment- Объект, который нужно прикрепить к операции приема; может бытьnull -
handler- Обработчик для обработки уведомлений от стека SCTP, илиnullдля игнорирования любых уведомлений. - Returns:
MessageInfo,nullесли этот канал в режиме без блокировки и сообщения недоступны сразу или обработчик уведомлений возвращаетRETURNпосле обработки уведомления- Throws:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции чтения, закрывая канал и устанавливая статус прерывания текущего потока -
NotYetConnectedException- Если этот канал еще не подключен -
IllegalReceiveException- Если заданный обработчик вызывает методreceiveэтого канала -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
send
public abstract int send(ByteBuffer src, MessageInfo messageInfo) throws IOException
Если этот канал в режиме без блокировки и в базовом буфере вывода достаточно места, или если этот канал в режиме блокировки и достаточно места появляется, то оставшиеся байты в заданном байтовом буфере передаются как одно сообщение. Отправка сообщения атомарна, если явное завершение сообщения SCTP_EXPLICIT_COMPLETE не включено в сокет этого канала.
Сообщение передаётся из байтового буфера так, как если бы это была обычная операция write.
Байты будут записаны в номер потока, который указан в streamNumber в заданном
messageInfo.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию отправки на этом канале, вызов этого метода будет заблокирован до завершения первой операции.
- Parameters:
-
src- Буфер, содержащий отправляемое сообщение -
messageInfo- Дополнительные данные о отправляемом сообщении - Returns:
- Количество отправленных байт, которое будет равно либо количеству оставшихся байтов в буфере сообщения, когда этот метод был вызван, либо, если этот канал неблокирующий, может быть равно нулю, если в базовом буфере вывода не было достаточно места для сообщения
- Throws:
-
InvalidStreamException- ЕслиstreamNumnerотрицательное или больше или равно максимальному числу исходящих потоков -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции чтения, закрывая канал и устанавливая статус прерывания текущего потока -
NotYetConnectedException- Если этот канал еще не подключен -
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/SctpChannel.html