Класс SctpMultiChannel
- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- java.nio.channels.spi.AbstractSelectableChannel
-
- com.sun.nio.sctp.SctpMultiChannel
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable,Channel,InterruptibleChannel
public abstract class SctpMultiChannel extends AbstractSelectableChannel
Выбираемый канал для сокетов SCTP, ориентированных на сообщения.
Многоканальный 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 | SctpMultiChannel(SelectorProvider provider) | Инициализирует новый экземпляр этого класса. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Set<Association> | associations() | Возвращает открытые ассоциации в сокете этого канала. |
SctpMultiChannel | bind(SocketAddress local) | Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания подключений. |
abstract SctpMultiChannel | bind(SocketAddress local,
int backlog) | Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания подключений. |
abstract SctpMultiChannel | bindAddress(InetAddress address) | Добавляет указанный адрес к привязанным адресам для сокета канала. |
abstract SctpChannel | branch(Association association) | Ветвит ассоциацию. |
abstract Set<SocketAddress> | getAllLocalAddresses() | Возвращает все адреса сокета, к которым привязан сокет этого канала. |
abstract <T> T | getOption(SctpSocketOption<T> name,
Association association) | Возвращает значение параметра сокета. |
abstract Set<SocketAddress> | getRemoteAddresses(Association association) | Возвращает все удаленные адреса, к которым подключена заданная ассоциация в сокете этого канала. |
static SctpMultiChannel | open() | Открывает многоканальный SCTP. |
abstract <T> MessageInfo | receive(ByteBuffer buffer,
T attachment,
NotificationHandler<T> handler) | Принимает сообщение и/или обрабатывает уведомление через этот канал. |
abstract int | send(ByteBuffer buffer,
MessageInfo messageInfo) | Отправляет сообщение через этот канал. |
abstract <T> SctpMultiChannel | setOption(SctpSocketOption<T> name,
T value,
Association association) | Устанавливает значение параметра сокета. |
abstract SctpMultiChannel | shutdown(Association association) | Закрывает ассоциацию без закрытия канала. |
abstract Set<SctpSocketOption<?>> | supportedOptions() | Возвращает набор параметров сокета, поддерживаемых этим каналом. |
abstract SctpMultiChannel | unbindAddress(InetAddress address) | Удаляет указанный адрес из привязанных адресов для сокета канала. |
int | validOps() | Возвращает набор операций, определяющий поддерживаемые операции этого канала. |
Методы, объявленные в классе java.nio.channels.spi.AbstractSelectableChannel
configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, provider, register Методы, объявленные в классе java.nio.channels.SelectableChannel
blockingLock, isBlocking, isRegistered, keyFor, register Методы, объявленные в классе java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы, объявленные в интерфейсе java.nio.channels.Channel
isOpen Подробное описание конструкторов
SctpMultiChannel
protected SctpMultiChannel(SelectorProvider provider)
Инициализирует новый экземпляр этого класса.
- Параметры:
-
provider- Поставщик селектора для этого канала
Методы
open
public static SctpMultiChannel open()
throws IOException Открывает многоканальный SCTP-сокет.
Новый канал не привязан.
- Возвращает:
- Новый многоканальный 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- Если тип указанного адреса не поддерживается -
SecurityException- Если установлен менеджер безопасности и его методcheckListenзапрещает операцию -
IOException- Если произошла другая ошибка ввода-вывода
bind
public final SctpMultiChannel bind(SocketAddress local)
throws IOException Привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений.
Этот метод работает так, как будто его вызов эквивалентен вычислению выражения:
bind(local, 0);
- Параметры:
-
local- Локальный адрес для привязки сокета, илиnullдля привязки сокета к автоматически назначенному адресу - Возвращает:
- Этот канал
- Выбрасывает:
-
ClosedChannelException- Если канал закрыт -
AlreadyBoundException- Если этот канал уже привязан -
UnsupportedAddressTypeException- Если тип указанного адреса не поддерживается -
SecurityException- Если установлен менеджер безопасности и его методcheckListenзапрещает операцию -
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- Тип значения параметра сокета - Параметры:
-
name- Параметр сокета -
association- Ассоциация, чьё значение параметра необходимо получить, илиnull, если этот параметр должен быть получен на уровне сокета канала. - Возвращает:
- Значение параметра сокета. Значение
nullможет быть допустимым значением для некоторых параметров сокета. - Выбрасывает:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - См. также:
SctpStandardSocketOptions
setOption
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
T value,
Association association)
throws IOException Устанавливает значение параметра сокета.
Обратите внимание, что некоторые параметры извлекаются из сокета канала, поэтому параметр association не применим и будет проигнорирован, если задан. Однако, если параметр относится к ассоциации, то должна быть указана ассоциация.
- Type Parameters:
-
T- Тип значения параметра сокета - Parameters:
-
name- Параметр сокета -
association- Ассоциация, параметр которой должен быть установлен, илиnull, если этот параметр должен быть установлен на уровне сокета канала. -
value- Значение параметра сокета. Значениеnullможет быть допустимым значением для некоторых параметров сокета. - Returns:
- Этот канал
- Throws:
-
UnsupportedOperationException- Если параметр сокета не поддерживается этим каналом -
IllegalArgumentException- Если значение не является допустимым значением для этого параметра сокета -
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла ошибка ввода-вывода - See Also:
SctpStandardSocketOptions
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. Если обработчик генерирует неперехваченное исключение, оно будет распространено вверх по стеку через этот метод.
Если установлена система управления безопасностью, то для каждой новой настройки ассоциации этот метод проверяет, разрешены ли исходный адрес и номер порта ассоциации системным менеджером безопасности с помощью метода checkAccept.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию получения по этому каналу, то вызов этого метода будет блокироваться до завершения первой операции. Предоставленный обработчик вызывается без удержания любых блокировок, используемых для обеспечения вышеупомянутой политики синхронизации, таким образом, обработчики не будут блокировать другие потоки от получения. Обработчик не должен вызывать метод receive этого канала, в противном случае будет выброшено исключение IllegalReceiveException.
- Type Parameters:
-
T- Тип присоединения - Parameters:
-
buffer- Буфер, в который должны быть переданы байты -
attachment- Объект, который нужно присоединить к операции получения; может бытьnull -
handler- Обработчик для обработки уведомлений от стека SCTP, илиnullдля игнорирования любых уведомлений. - Returns:
MessageInfo,nullесли этот канал находится в режиме асинхронного ввода-вывода и сообщения немедленно недоступны или обработчик уведомлений возвращаетRETURNпосле обработки уведомления- Throws:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал, пока операция чтения находится в процессе -
ClosedByInterruptException- Если другой поток прерывает текущий поток, пока операция чтения находится в процессе, тем самым закрывая канал и устанавливая состояние прерывания текущего потока -
NotYetBoundException- Если этот канал еще не привязан -
IllegalReceiveException- Если предоставленный обработчик вызывает методreceiveэтого канала -
SecurityException- Если установлена система управления безопасностью, и она не разрешает принятие новых ассоциаций от отправителя сообщения -
IOException- Если произошла какая-то другая ошибка ввода-вывода
send
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.
Если установлена система управления безопасностью, то для каждой новой настройки ассоциации этот метод проверяет, разрешены ли адрес и номер порта удаленных узлов системным менеджером безопасности с помощью метода checkConnect.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию отправки по этому каналу, то вызов этого метода будет блокироваться до завершения первой операции.
- Parameters:
-
buffer- Буфер, содержащий сообщение, которое нужно отправить -
messageInfo- Дополнительные данные о сообщении, которое нужно отправить - Returns:
- Количество отправленных байтов, которое будет равно либо количеству оставшихся байтов в буфере сообщения при вызове этого метода, либо, если этот канал находится в режиме асинхронного ввода-вывода, может быть равно нулю, если в базовом буфере вывода не было достаточно места для сообщения
- Throws:
-
InvalidStreamException- ЕслиstreamNumberотрицательно или если ассоциация уже существует, иstreamNumberбольше максимального числа исходящих потоков -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал, пока операция чтения находится в процессе -
ClosedByInterruptException- Если другой поток прерывает текущий поток, пока операция чтения находится в процессе, тем самым закрывая канал и устанавливая состояние прерывания текущего потока -
SecurityException- Если установлена система управления безопасностью, и она не разрешает создание новых ассоциаций с адресом сообщения -
IOException- Если произошла какая-то другая ошибка ввода-вывода
branch
public abstract SctpChannel branch(Association association)
throws IOException Отделяет ассоциацию.
Приложение может вызвать этот метод, чтобы отделить ассоциацию в отдельный канал. Новый связанный и подключенный SctpChannel будет создан для ассоциации. Отделенная ассоциация больше не будет частью этого канала.
Это особенно полезно, когда, например, приложение хочет, чтобы несколько случайных отправителей/получателей сообщений оставались в исходном многоканальном SCTP, но отделяло те ассоциации, которые переносят трафик больших объемов данных, в собственные отдельные каналы SCTP.
- Параметры:
-
association- Ассоциация, которую нужно отделить - Возвращает:
SctpChannel- Исключения:
-
ClosedChannelException- Если этот канал закрыт -
IOException- Если произошла какая-либо другая ошибка ввода-вывода
© 1993, 2020, 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/11/docs/api/jdk.sctp/com/sun/nio/sctp/SctpMultiChannel.html