Класс 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- Если тип заданного удалённого адреса не поддерживается -
SecurityException- Если установлен менеджер безопасности и он не разрешает доступ к указанному удалённому узлу -
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- Если произошла другая ошибка ввода-вывода -
SecurityException- Если установлен менеджер безопасности и его методcheckListenотклоняет операцию
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.
Если этот канал находится в режиме ожидания, то вызов этого метода будет блокироваться до тех пор, пока подключение не будет установлено или не произойдет ошибка ввода-вывода.
Если установлена система безопасности, то этот метод проверяет, что метод checkConnect разрешает подключение к адресу и номеру порта указанного удаленного узла.
Этот метод можно вызывать в любое время. Если операция send или receive над этим каналом вызывается во время выполнения вызова этого метода, то эта операция сначала будет заблокирована до завершения этого вызова. Если попытка подключения инициирована, но не удалась, то есть, если вызов этого метода выбрасывает обработанное исключение, то канал будет закрыт.
- Parameters:
-
remote- Удаленный узел, к которому должен быть подключен этот канал - Returns:
-
trueесли подключение было установлено,falseесли этот канал находится в режиме без ожидания и операция подключения находится в процессе выполнения - Throws:
-
AlreadyConnectedException- Если этот канал уже подключен -
ConnectionPendingException- Если операция подключения без ожидания уже выполняется на этом канале -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции подключения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции подключения, закрывая канал и устанавливая статус прерывания текущего потока -
UnresolvedAddressException- Если указанный удаленный адрес не полностью разрешен -
UnsupportedAddressTypeException- Если тип указанного удаленного адреса не поддерживается -
SecurityException- Если установлена система безопасности, и она не разрешает доступ к указанному удаленному узлу -
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- Если тип указанного удаленного адреса не поддерживается -
SecurityException- Если установлена система безопасности, и она не разрешает доступ к указанному удаленному узлу -
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, 2023, 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/21/docs/api/jdk.sctp/com/sun/nio/sctp/SctpChannel.html