Класс 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Включает или отключает алгоритм, аналогичный алгоритму Нейгла 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() |
Возвращает набор операций, указывающий операции, поддерживаемые этим каналом. |
Методы, объявленные в классе AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
Методы, объявленные в классе SelectableChannel
register
Методы, объявленные в классе 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 для этого канала, эта операция сначала будет заблокирована до завершения данного вызова. Если попытка подключения инициирована, но завершается неудачей, то есть вызов этого метода выбрасывает проверяемое исключение, канал будет закрыт.
- Параметры:
-
remote— удаленный узел, к которому нужно подключить этот канал - Возвращает:
-
true, если соединение установлено,false, если этот канал работает в неблокирующем режиме и операция подключения выполняется - Выбрасывает:
-
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 задают максимальное количество потоков, в которые приложение должно иметь возможность отправлять данные и из которых оно должно иметь возможность получать данные. Эти значения согласуются с удаленным узлом и могут быть ограничены операционной системой.
- Параметры:
-
remote— удаленный узел, к которому нужно подключить этот канал -
maxOutStreams— значение должно быть неотрицательным и не превышать65536.0, чтобы использовать значение по умолчанию для конечной точки. -
maxInStreams— значение должно быть неотрицательным и не превышать65536.0, чтобы использовать значение по умолчанию для конечной точки. - Возвращает:
-
true, если соединение установлено,false, если этот канал работает в неблокирующем режиме и операция подключения выполняется - Выбрасывает:
-
AlreadyConnectedException— если этот канал уже подключен -
ConnectionPendingException— если для этого канала уже выполняется неблокирующая операция подключения -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции подключения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции подключения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
UnresolvedAddressException— если указанный удаленный адрес разрешен не полностью -
UnsupportedAddressTypeException— если тип указанного удаленного адреса не поддерживается -
IOException— если происходит другая ошибка ввода-вывода
isConnectionPending
public abstract boolean isConnectionPending()
- Возвращает:
-
trueтогда и только тогда, когда операция подключения для этого канала была инициирована, но еще не завершена вызовом методаfinishConnect()
finishConnect
public abstract boolean finishConnect() throws IOException
Неблокирующая операция подключения инициируется переводом канала сокета в неблокирующий режим с последующим вызовом одного из его методов connect. После установления соединения или неудачной попытки канал становится готовым к подключению, и для завершения последовательности подключения можно вызвать этот метод. Если операция подключения завершилась неудачей, вызов этого метода приведет к выбросу соответствующего исключения IOException.
Если этот канал уже подключен, метод не будет блокироваться и немедленно вернет true. Если этот канал работает в неблокирующем режиме, метод вернет false, если процесс подключения еще не завершен. Если этот канал работает в блокирующем режиме, метод будет заблокирован до завершения процесса подключения или его неудачного окончания и всегда либо вернет true, либо выбросит проверяемое исключение с описанием ошибки.
Этот метод можно вызвать в любое время. Если во время выполнения вызова этого метода будет вызвана операция send или receive для этого канала, эта операция сначала будет заблокирована до завершения данного вызова. Если попытка подключения завершается неудачей, то есть вызов этого метода выбрасывает проверяемое исключение, канал будет закрыт.
- Возвращает:
-
trueтогда и только тогда, когда сокет этого канала теперь подключен - Выбрасывает:
-
NoConnectionPendingException— если этот канал не подключен и операция подключения не была инициирована -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции подключения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции подключения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException— если происходит другая ошибка ввода-вывода
getAllLocalAddresses
public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
- Возвращает:
- Все адреса сокета, к которым привязан сокет этого канала, или пустой
Set, если сокет канала не привязан - Выбрасывает:
-
ClosedChannelException— если канал закрыт -
IOException— если произошла ошибка ввода-вывода
getRemoteAddresses
public abstract Set<SocketAddress> getRemoteAddresses() throws IOException
Если канал подключен к удаленному узлу, привязанному к нескольким адресам, сокет канала будет подключен именно к этим адресам.
- Возвращает:
- Все удаленные адреса, к которым подключен сокет этого канала, или пустой
Set, если сокет канала не подключен - Выбрасывает:
-
ClosedChannelException— если канал закрыт -
IOException— если произошла ошибка ввода-вывода
shutdown
public abstract SctpChannel shutdown() throws IOException
Отправляет удаленному узлу команду завершения работы, фактически запрещая обоим узлам записывать новые данные в сокет. При дальнейших попытках отправки будет выброшено исключение ClosedChannelException. Канал остается открытым, чтобы принимать данные (и уведомления), которые узел-партнер мог отправить до получения команды завершения работы. Если канал уже завершил работу, вызов этого метода не оказывает никакого эффекта.
- Возвращает:
- Этот канал
- Выбрасывает:
-
NotYetConnectedException— если этот канал еще не подключен -
ClosedChannelException— если этот канал закрыт -
IOException— если происходит другая ошибка ввода-вывода
getOption
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException
- Параметры типа:
T— тип значения параметра сокета- Параметры:
-
name— параметр сокета - Возвращает:
- Значение параметра сокета. Для некоторых параметров сокета значение
nullможет быть допустимым. - Выбрасывает:
-
UnsupportedOperationException— если этот канал не поддерживает параметр сокета -
ClosedChannelException— если этот канал закрыт -
IOException— если произошла ошибка ввода-вывода - См. также:
setOption
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) throws IOException
- Параметры типа:
T— тип значения параметра сокета- Параметры:
-
name— параметр сокета -
value— значение параметра сокета. Для некоторых параметров сокета значениеnullможет быть допустимым. - Возвращает:
- Этот канал
- Выбрасывает:
-
UnsupportedOperationException— если этот канал не поддерживает параметр сокета -
IllegalArgumentException— если это значение недопустимо для данного параметра сокета -
ClosedChannelException— если этот канал закрыт -
IOException— если произошла ошибка ввода-вывода - См. также:
supportedOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
Этот метод продолжает возвращать набор параметров и после закрытия канала.
- Возвращает:
- Набор параметров сокета, поддерживаемых этим каналом
validOps
public final int validOps()
Каналы SCTP поддерживают подключение, чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE).
- Определено в:
-
validOpsв классеSelectableChannel - Возвращает:
- Набор допустимых операций
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.
- Параметры типа:
T— тип прикрепленного объекта- Параметры:
-
dst— буфер, в который нужно перенести байты сообщения -
attachment— объект, прикрепляемый к операции получения данных; может бытьnull -
handler— обработчик уведомлений от стека SCTP илиnull, чтобы игнорировать все уведомления. - Возвращает:
- Объект
MessageInfo,null, если этот канал работает в неблокирующем режиме и сообщения немедленно недоступны либо обработчик уведомлений возвращаетRETURNпосле обработки уведомления - Выбрасывает:
-
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
NotYetConnectedException— если этот канал еще не подключен -
IllegalReceiveException— если указанный обработчик вызывает методreceiveэтого канала -
IOException— если происходит другая ошибка ввода-вывода
send
public abstract int send(ByteBuffer src, MessageInfo messageInfo) throws IOException
Если этот канал работает в неблокирующем режиме и в базовом выходном буфере достаточно места либо если этот канал работает в блокирующем режиме и достаточное место становится доступным, оставшиеся байты указанного байтового буфера передаются как одно сообщение. Отправка сообщения выполняется атомарно, если для сокета этого канала не включен параметр сокета явного завершения сообщения SCTP_EXPLICIT_COMPLETE.
Сообщение переносится из байтового буфера, как при обычной операции write.
Байты будут записаны в поток с номером, указанным методом streamNumber в заданном
messageInfo.
Этот метод можно вызвать в любое время. Если другой поток уже инициировал операцию отправки для этого канала, вызов этого метода будет заблокирован до завершения первой операции.
- Параметры:
-
src— буфер, содержащий отправляемое сообщение -
messageInfo— дополнительные данные об отправляемом сообщении - Возвращает:
- Количество отправленных байтов: либо количество байтов, оставшихся в буфере сообщения на момент вызова этого метода, либо, если канал работает в неблокирующем режиме, ноль, если в базовом выходном буфере недостаточно места для сообщения
- Выбрасывает:
-
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://docs.oracle.com/en/java/javase/25/docs/api/jdk.sctp/com/sun/nio/sctp/SctpChannel.html