Spec-Zone.ru › OpenJDK 17

Класс SocketChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.SelectableChannel
java.nio.channels.spi.AbstractSelectableChannel
java.nio.channels.SocketChannel
Все реализованные интерфейсы:
Closeable, AutoCloseable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, NetworkChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel
public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
Выбираемый канал для сокетов с потоковым подключением.

Канал сокета создаётся путём вызова одного из open методов этого класса. Метод open без аргументов открывает канал сокета для сокета протокола Интернета. Метод open(ProtocolFamily) используется для открытия канала сокета для сокета заданной семейства протоколов. Невозможно создать канал для произвольного, уже существующего сокета. Недавно созданный канал сокета открыт, но ещё не подключён. Попытка вызвать операцию ввода-вывода над отключённым каналом приведёт к выбрасыванию NotYetConnectedException. Канал сокета можно подключить, вызвав его метод connect; после подключения канал сокета остаётся подключённым до его закрытия. Подключён ли канал сокета можно определить, вызвав его метод isConnected.

Каналы сокетов поддерживают бесподключное соединение: канал сокета может быть создан, и процесс установления связи с удалённым сокетом может быть инициирован через метод connect для последующего завершения методом finishConnect. Процесс подключения может быть определён путём вызова метода isConnectionPending.

Каналы сокетов поддерживают асинхронное закрытие, что аналогично асинхронной операции закрытия, указанной в классе Channel. Если входная сторона сокета закрывается одним потоком, в то время как другой поток заблокирован в операции чтения на канале сокета, операция чтения в заблокированном потоке завершится без чтения каких-либо байтов и вернёт -1. Если выходная сторона сокета закрывается одним потоком, в то время как другой поток заблокирован в операции записи на канале сокета, заблокированный поток получит AsynchronousCloseException.

Параметры сокета настраиваются с помощью метода setOption. Каналы сокетов для сокетов протокола Интернета поддерживают следующие параметры:

Параметры сокета
Имя параметра Описание
SO_SNDBUF Размер буфера отправки сокета
SO_RCVBUF Размер буфера приёма сокета
SO_KEEPALIVE Поддерживать соединение активным
SO_REUSEADDR Переиспользовать адрес
SO_LINGER Задержка при закрытии, если данные присутствуют (только при конфигурации в блокирующем режиме)
TCP_NODELAY Отключить алгоритм Nagle

Каналы сокетов для сокетов доменных сокетов Unix поддерживают:

Параметры сокета
Имя параметра Описание
SO_SNDBUF Размер буфера отправки сокета
SO_RCVBUF Размер буфера приёма сокета
SO_LINGER Задержка при закрытии, если данные присутствуют (только при конфигурации в блокирующем режиме)

Также могут поддерживаться дополнительные (специфичные для реализации) параметры.

Каналы сокетов безопасны для использования несколькими одновременными потоками. Они поддерживают одновременное чтение и запись, хотя не более одного потока может читать и не более одного потока может записывать в любой данный момент. Методы connect и finishConnect взаимно синхронизированы, и попытка начать операцию чтения или записи, пока в процессе выполняется один из этих методов, будет заблокирована до завершения этого вызова.

С момента:
1.4

Краткое описание конструкторов

SocketChannel(SelectorProvider provider)
Модификатор Конструктор Описание
protected
Инициализирует новый экземпляр этого класса.

Краткое описание методов

Модификатор и тип Метод Описание
abstract SocketChannel bind(SocketAddress local)
Связывает сокет канала с локальным адресом.
abstract boolean connect(SocketAddress remote)
Подключает сокет этого канала.
abstract boolean finishConnect()
Завершает процесс подключения сокета канала.
abstract SocketAddress getLocalAddress()
Возвращает адрес сокета, к которому привязан сокет этого канала.
abstract SocketAddress getRemoteAddress()
Возвращает удалённый адрес, к которому подключен сокет этого канала.
abstract boolean isConnected()
Указывает, подключен ли сетевой сокет этого канала.
abstract boolean isConnectionPending()
Указывает, выполняется ли операция подключения на этом канале.
static SocketChannel open()
Открывает сокет-канал для сокета протокола Интернет.
static SocketChannel open(ProtocolFamily family)
Открывает сокет-канал.
static SocketChannel open(SocketAddress remote)
Открывает сокет-канал и подключает его к удалённому адресу.
abstract int read(ByteBuffer dst)
Читает последовательность байтов из этого канала в указанный буфер.
final long read(ByteBuffer[] dsts)
Читает последовательность байтов из этого канала в указанные буферы.
abstract long read(ByteBuffer[] dsts, int offset, int length)
Читает последовательность байтов из этого канала в подпоследовательность заданных буферов.
abstract <T> SocketChannel setOption(SocketOption<T> name, T value)
Устанавливает значение опции сокета.
abstract SocketChannel shutdownInput()
Завершает подключение для чтения без закрытия канала.
abstract SocketChannel shutdownOutput()
Завершает подключение для записи без закрытия канала.
abstract Socket socket()
Получает сокет, связанный с этим каналом.
final int validOps()
Возвращает набор операций, определяющий поддерживаемые операции этого канала.
abstract int write(ByteBuffer src)
Записывает последовательность байтов в этот канал из заданного буфера.
final long write(ByteBuffer[] srcs)
Записывает последовательность байтов в этот канал из заданных буферов.
abstract long write(ByteBuffer[] srcs, int offset, int length)
Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов.

Методы, объявленные в классе 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

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Методы, объявленные в интерфейсе java.nio.channels.Channel

isOpen

Методы, объявленные в интерфейсе java.nio.channels.NetworkChannel

getOption, supportedOptions

Подробное описание конструкторов

SocketChannel

protected SocketChannel(SelectorProvider provider)
Инициализирует новый экземпляр этого класса.
Параметры:
provider - Поставщик, создавший этот канал

Подробное описание методов

open

public static SocketChannel open() throws IOException
Открывает сокет-канал для сокета протокола Интернет.

Новый канал создается путем вызова метода openSocketChannel глобального системного объекта SelectorProvider.

Возвращает:
Новый сокет-канал
Исключения:
IOException - Если произошла ошибка ввода-вывода
См. также:
  • системная переменная java.net.preferIPv4Stack

open

public static SocketChannel open(ProtocolFamily family) throws IOException
Открывает сокет-канал. Параметр family определяет protocol family сокета канала.

Новый канал создается путем вызова метода openSocketChannel(ProtocolFamily) глобального системного. SelectorProvider объекта.

Параметры:
family - Семейство протоколов
Возвращает:
Новый сокет-канал
Исключения:
UnsupportedOperationException - Если указанное семейство протоколов не поддерживается. Например, если параметр задан как StandardProtocolFamily.INET6, но IPv6 не включен в платформе.
IOException - Если произошла ошибка ввода-вывода
См. также:
  • системная переменная java.net.preferIPv4Stack
Since:
15

open

public static SocketChannel open(SocketAddress remote) throws IOException
Открывает сокет-канал и подключает его к удаленному адресу.

Если удаленный адрес является InetSocketAddress, то этот метод работает так же, как если бы был вызван метод open(), метод connect был вызван на полученном сокет-канале, передавая ему remote, и затем возвращается этот канал.

Если удаленный адрес является UnixDomainSocketAddress, то это работает путем вызова метода open(ProtocolFamily) с StandardProtocolFamily.UNIX в качестве параметра, вызова метода connect на полученном сокет-канале, передавая ему remote, затем возвращая этот канал.

Параметры:
remote - Удаленный адрес, к которому должен быть подключен новый канал
Возвращает:
Новый и подключенный сокет-канал
Исключения:
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции подключения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции подключения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
UnresolvedAddressException - Если заданный удалённый адрес InetSocketAddress не полностью разрешен
UnsupportedAddressTypeException - Если тип заданного удалённого адреса не поддерживается
SecurityException - Если установлен менеджер безопасности, и он не разрешает доступ к указанному удалённому узлу
IOException - Если произошла какая-либо другая ошибка ввода-вывода
См. также:
  • системная переменная java.net.preferIPv4Stack

validOps

public final int validOps()
Возвращает набор операций, идентифицирующих поддерживаемые операции этого канала.

Сокет-каналы поддерживают подключение, чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE).

Определено в:
validOps в классе SelectableChannel
Возвращает:
Набор допустимых операций

bind

public abstract SocketChannel bind(SocketAddress local) throws IOException
Привязывает сокет канала к локальному адресу.

Этот метод используется для установления связи между сокетом и локальным адресом. Для сокетов протокола Интернет, после установления связи, сокет остается привязанным до закрытия канала. Если параметр local имеет значение null, то сокет будет привязан к автоматически назначенному адресу.

Определено в:
bind в интерфейсе NetworkChannel
Примечание API:
Привязка сокет-канала к сокету Unix Domain создает файл, соответствующий пути к файлу в UnixDomainSocketAddress. Этот файл сохраняется после закрытия канала, и его необходимо удалить, прежде чем другой сокет сможет привязаться к тому же имени. Если сокет-канал к сокету Unix Domain неявно привязывается путем подключения без предварительного вызова bind, то его сокет является безымянным без соответствующего файла сокета в файловой системе. Если сокет-канал к сокету Unix Domain автоматически привязывается вызовом bind(null), это также приводит к безымянному сокету.
Примечание реализации:
Каждая платформа обеспечивает максимально допустимую длину имени сокета Unix Domain. Это ограничение применяется при привязке канала. Максимальная длина обычно близка к 100 байтам и не меньше.
Параметры:
local - Адрес для привязки сокета, или null для привязки сокета к автоматически назначенному адресу сокета
Возвращает:
Этот канал
Исключения:
ConnectionPendingException - Если в данный момент на этом канале выполняется неблокирующая операция подключения
AlreadyBoundException - Если сокет уже привязан
UnsupportedAddressTypeException - Если тип заданного адреса не поддерживается
ClosedChannelException - Если канал закрыт
IOException - Если произошла какая-либо другая ошибка ввода-вывода
SecurityException - Если установлен менеджер безопасности и его метод checkListen отклоняет операцию для адреса сокета протокола Интернет или для адреса сокета Unix domain, если он отклоняет NetPermission("accessUnixDomainSocket").
См. также:
  • NetworkChannel.getLocalAddress()
Since:
1.7

setOption

public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
Описание скопировано из интерфейса: NetworkChannel
Устанавливает значение опции сокета.
Определено в:
setOption в интерфейсе NetworkChannel
Параметры типа:
T - Тип значения опции сокета
Параметры:
name - Опция сокета
value - Значение опции сокета. Значение null может быть допустимым значением для некоторых опций сокета.
Возвращает:
Этот канал
Исключения:
UnsupportedOperationException - Если опция сокета не поддерживается этим каналом
IllegalArgumentException - Если значение не является допустимым значением для этой опции сокета
ClosedChannelException - Если этот канал закрыт
IOException - Если произошла ошибка ввода-вывода
См. также:
  • StandardSocketOptions
Since:
1.7

shutdownInput

public abstract SocketChannel shutdownInput() throws IOException
Закрывает подключение для чтения без закрытия канала.

После закрытия для чтения дальнейшие чтения из канала вернут -1, указание конца потока. Если сторона подключения для чтения уже закрыта, вызов этого метода не повлияет.

Возвращает:
Канал
Исключения:
NotYetConnectedException - Если этот канал еще не подключен
ClosedChannelException - Если этот канал закрыт
IOException - Если произошла какая-либо другая ошибка ввода-вывода
Since:
1.7

shutdownOutput

public abstract SocketChannel shutdownOutput() throws IOException
Закрывает подключение для записи без закрытия канала.

После закрытия для записи дальнейшие попытки записи в канал сгенерируют ClosedChannelException. Если сторона подключения для записи уже закрыта, вызов этого метода не повлияет.

Возвращает:
Канал
Исключения:
NotYetConnectedException - Если этот канал еще не подключен
ClosedChannelException - Если этот канал закрыт
IOException - Если произошла какая-либо другая ошибка ввода-вывода
Since:
1.7

socket

public abstract Socket socket()
Возвращает сокет, связанный с этим каналом.
Возвращает:
Сокет, связанный с этим каналом
Исключения:
UnsupportedOperationException - Если сокет канала не является сокетом протокола Интернет

isConnected

public abstract boolean isConnected()
Указывает, подключен ли сетевой сокет этого канала.
Возвращает:
true тогда и только тогда, когда сетевой сокет этого канала open и подключен

isConnectionPending

public abstract boolean isConnectionPending()
Указывает, происходит ли операция подключения к этому каналу.
Возвращает:
true тогда и только тогда, когда операция подключения была инициирована для этого канала, но ещё не завершена вызовом метода finishConnect

connect

public abstract boolean connect(SocketAddress remote) throws IOException
Подключает сокет этого канала.

Если этот канал находится в режиме асинхронного ввода-вывода, вызов этого метода инициирует асинхронную операцию подключения. Если подключение установлено немедленно, как может произойти при локальном подключении, то этот метод возвращает true. В противном случае этот метод возвращает false и операцию подключения необходимо завершить, вызвав метод finishConnect.

Если этот канал находится в режиме блокирующего ввода-вывода, вызов этого метода будет блокировать выполнение, пока подключение не будет установлено или не произойдёт ошибка ввода-вывода.

Для каналов с сокетами протокола Интернета этот метод выполняет точно такие же проверки безопасности, как и класс Socket. То есть, если менеджер безопасности был установлен, то этот метод проверяет, разрешает ли его метод checkConnect подключение к адресу и номеру порта заданного удалённого узла.

Для каналов с сокетами доменных адресов Unix этот метод проверяет NetPermission ("accessUnixDomainSocket") у менеджера безопасности с помощью метода checkPermission.

Этот метод можно вызывать в любое время. Если операция чтения или записи на этом канале вызывается во время выполнения вызова этого метода, то эта операция сначала будет блокироваться до завершения этого вызова. Если попытка подключения терпит неудачу, то есть, если вызов этого метода бросает проверяемое исключение, то канал будет закрыт.

Параметры:
remote - Удалённый адрес, к которому должен быть подключён этот канал
Возвращает:
true если подключение было установлено, false если этот канал находится в режиме асинхронного ввода-вывода и операция подключения в процессе выполнения
Исключения:
AlreadyConnectedException - Если этот канал уже подключён
ConnectionPendingException - Если операция асинхронного подключения уже выполняется для этого канала
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время операции подключения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока
UnresolvedAddressException - Если заданный удалённый адрес является InetSocketAddress, который не полностью разрешён
UnsupportedAddressTypeException - Если тип заданного удалённого адреса не поддерживается
SecurityException - Если менеджер безопасности был установлен и он не разрешает доступ к заданному удалённому узлу
IOException - Если произошла другая ошибка ввода-вывода

finishConnect

public abstract boolean finishConnect() throws IOException
Завершает процесс подключения сокета канала.

Операция асинхронного подключения инициируется, поместив канал сокета в режим асинхронного ввода-вывода, а затем вызвав метод connect. После установления подключения или неудачи попытки подключение становится доступным, и этот метод может быть вызван для завершения последовательности подключения. Если операция подключения завершилась неудачей, то вызов этого метода вызовет соответствующее исключение IOException.

Если этот канал уже подключён, то этот метод не будет блокировать выполнение и немедленно вернёт true. Если этот канал находится в режиме асинхронного ввода-вывода, то этот метод вернёт false если процесс подключения ещё не завершён. Если этот канал находится в режиме блокирующего ввода-вывода, то этот метод будет блокировать выполнение до завершения или неудачи подключения, и всегда либо вернёт true или бросит проверяемое исключение, описывающее ошибку.

Этот метод может быть вызван в любое время. Если операция чтения или записи на этом канале вызывается во время выполнения вызова этого метода, то эта операция сначала будет блокироваться до завершения этого вызова. Если попытка подключения завершается неудачей, то есть, если вызов этого метода бросает проверяемое исключение, то канал будет закрыт.

Возвращает:
true если сокет этого канала теперь подключён
Исключения:
NoConnectionPendingException - Если этот канал не подключён и операция подключения не была инициирована
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время операции подключения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время операции подключения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока
IOException - Если произошла другая ошибка ввода-вывода

getRemoteAddress

public abstract SocketAddress getRemoteAddress() throws IOException
Возвращает удалённый адрес, к которому подключён сокет этого канала.

Если сокет канала привязан и подключён к адресу сокета протокола Интернета, то возвращаемое значение имеет тип InetSocketAddress.

Если сокет канала привязан и подключён к адресу сокета доменного адреса Unix, то возвращаемый адрес — UnixDomainSocketAddress.

Возвращает:
Удалённый адрес; null если сокет канала не подключён
Исключения:
ClosedChannelException - Если канал закрыт
IOException - Если произошла ошибка ввода-вывода
С тех пор:
1.7

read

public abstract int read(ByteBuffer dst) throws IOException
Описание скопировано из интерфейса: ReadableByteChannel
Считывает последовательность байтов из этого канала в заданный буфер.

Производится попытка чтения до r байтов из канала, где r — количество байтов, оставшихся в буфере, то есть, dst.remaining(), в момент вызова этого метода.

Предположим, что последовательность байтов длиной n была прочитана, где 0 <= n <= r. Эта последовательность байтов будет перенесена в буфер таким образом, что первый байт в последовательности будет в индексе p, а последний байт — в индексе p + n - 1, где p — позиция буфера в момент вызова этого метода. По завершении выполнения метод вернёт позицию буфера, равную p + n; его предел не изменится.

Операция чтения может не заполнить буфер, и, в действительности, может вообще не прочитать никаких байтов. Влияет ли это или нет, зависит от характера и состояния канала. Например, канал сокета в режиме асинхронного ввода-вывода не может прочитать больше байтов, чем сразу доступно в буфере ввода сокета; аналогично, канал файла не может прочитать больше байтов, чем остаётся в файле. Однако гарантируется, что если канал находится в режиме блокирующего ввода-вывода и в буфере есть хотя бы один байт, то этот метод будет блокировать выполнение до тех пор, пока не будет прочитан хотя бы один байт.

Этот метод можно вызывать в любое время. Однако, если другой поток уже инициировал операцию чтения на этом канале, то вызов этого метода будет блокировать выполнение до тех пор, пока первая операция не завершится.

Определено в:
read в интерфейсе ReadableByteChannel
Параметры:
dst - Буфер, в который должны быть перенесены байты
Возвращает:
Количество прочитанных байтов, возможно ноль, или -1 если канал достиг конца потока
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время операции чтения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время операции чтения, тем самым закрывая канал и устанавливая флаг прерывания текущего потока
IOException - Если произошла другая ошибка ввода-вывода

чтение

public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
Описание скопировано из интерфейса: ScatteringByteChannel
Считывает последовательность байтов из этого канала в подпоследовательность заданных буферов.

Вызов этого метода пытается прочитать до r байтов из этого канала, где r — общее количество байтов, оставшихся в указанной подпоследовательности массива буферов, то есть,

 dsts[offset].remaining()
     + dsts[offset+1].remaining()
     + ... + dsts[offset+length-1].remaining()
в момент вызова этого метода.

Предположим, что считывается последовательность байтов длиной n, где 0 <= n <= r. До первых dsts[offset].remaining() байтов этой последовательности передаются в буфер dsts[offset], до следующих dsts[offset+1].remaining() байтов — в буфер dsts[offset+1], и так далее, пока вся последовательность байтов не будет передана в заданные буферы. В каждый буфер передаётся как можно больше байтов, поэтому конечная позиция каждого обновлённого буфера, кроме последнего обновлённого буфера, гарантированно равна пределу этого буфера.

Этот метод может быть вызван в любое время. Однако, если другой поток уже инициировал операцию чтения в этом канале, то вызов этого метода будет блокироваться до завершения первой операции.

Определено в:
read в интерфейсе ScatteringByteChannel
Параметры:
dsts - Буферы, в которые должны быть переданы байты
offset - Смещение в массиве буферов первого буфера, в который должны быть переданы байты; должно быть неотрицательным и не превышать dsts.length
length - Максимальное количество буферов для доступа; должно быть неотрицательным и не превышать dsts.length - offset
Возвращает:
Количество прочитанных байтов, возможно ноль, или -1 если канал достиг конца потока
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException - Если произошла какая-либо другая ошибка ввода-вывода

чтение

public final long read(ByteBuffer[] dsts) throws IOException
Описание скопировано из интерфейса: ScatteringByteChannel
Считывает последовательность байтов из этого канала в заданные буферы.

Вызов этого метода в форме c.read(dsts) ведет себя точно так же, как вызов

 c.read(dsts, 0, dsts.length);
Определено в:
read в интерфейсе ScatteringByteChannel
Параметры:
dsts - Буферы, в которые должны быть переданы байты
Возвращает:
Количество прочитанных байтов, возможно ноль, или -1 если канал достиг конца потока
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException - Если произошла какая-либо другая ошибка ввода-вывода

запись

public abstract int write(ByteBuffer src) throws IOException
Описание скопировано из интерфейса: WritableByteChannel
Записывает последовательность байтов в этот канал из заданного буфера.

Пытается записать до r байтов в канал, где r — количество оставшихся байтов в буфере, то есть, src.remaining(), в момент вызова этого метода.

Предположим, что записана последовательность байтов длиной n, где 0 <= n <= r. Эта последовательность байтов будет передана из буфера, начиная с индекса p, где p — позиция буфера в момент вызова этого метода; индекс последнего записанного байта будет p + n - 1. После возврата позиция буфера будет равна p + n; его предел не изменится.

Если не указано иное, операция записи вернётся только после записи всех r запрошенных байтов. Некоторые типы каналов, в зависимости от их состояния, могут записать только часть байтов или возможно вообще не записать. Например, сокет-канал в режиме без блокировки не может записать больше байтов, чем свободно в буфере вывода сокета.

Этот метод может быть вызван в любое время. Однако, если другой поток уже инициировал операцию записи в этот канал, то вызов этого метода будет блокироваться до завершения первой операции.

Определено в:
write в интерфейсе WritableByteChannel
Параметры:
src - Буфер, из которого будут извлечены байты
Возвращает:
Количество записанных байтов, возможно ноль
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException - Если произошла какая-либо другая ошибка ввода-вывода

запись

public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
Описание скопировано из интерфейса: GatheringByteChannel
Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов.

Пытается записать до r байтов в этот канал, где r — общее количество оставшихся байтов в указанной подпоследовательности массива буферов, то есть,

 srcs[offset].remaining()
     + srcs[offset+1].remaining()
     + ... + srcs[offset+length-1].remaining()
в момент вызова этого метода.

Предположим, что записана последовательность байтов длиной n, где 0 <= n <= r. До первых srcs[offset].remaining() байтов этой последовательности записываются из буфера srcs[offset], до следующих srcs[offset+1].remaining() байтов — из буфера srcs[offset+1], и так далее, пока вся последовательность байтов не будет записана. Максимальное количество байтов записывается из каждого буфера, поэтому конечная позиция каждого обновлённого буфера, кроме последнего обновлённого буфера, гарантированно равна пределу этого буфера.

Если не указано иное, операция записи вернётся только после записи всех r запрошенных байтов. Некоторые типы каналов, в зависимости от их состояния, могут записать только часть байтов или возможно вообще не записать. Например, сокет-канал в режиме без блокировки не может записать больше байтов, чем свободно в буфере вывода сокета.

Этот метод может быть вызван в любое время. Однако, если другой поток уже инициировал операцию записи в этот канал, то вызов этого метода будет блокироваться до завершения первой операции.

Определено в:
write в интерфейсе GatheringByteChannel
Параметры:
srcs - Буферы, из которых будут извлечены байты
offset - Смещение в массиве буферов первого буфера, из которого будут извлечены байты; должно быть неотрицательным и не превышать srcs.length
length - Максимальное количество буферов для доступа; должно быть неотрицательным и не превышать srcs.length - offset
Возвращает:
Количество записанных байтов, возможно ноль
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException - Если произошла какая-либо другая ошибка ввода-вывода

запись

public final long write(ByteBuffer[] srcs) throws IOException
Описание скопировано из интерфейса: GatheringByteChannel
Записывает последовательность байтов в этот канал из заданных буферов.

Вызов этого метода в форме c.write(srcs) ведет себя точно так же, как вызов

 c.write(srcs, 0, srcs.length);
Определено в:
write в интерфейсе GatheringByteChannel
Параметры:
srcs - Буферы, из которых будут извлечены байты
Возвращает:
Количество записанных байтов, возможно ноль
Исключения:
NotYetConnectedException - Если этот канал ещё не подключён
ClosedChannelException - Если этот канал закрыт
AsynchronousCloseException - Если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException - Если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException - Если произошла какая-либо другая ошибка ввода-вывода

getLocalAddress

public abstract SocketAddress getLocalAddress() throws IOException
Возвращает адрес сокета, к которому привязан сокет данного канала.

Если канал привязан к адресу сокета Интернета (Internet Protocol), то возвращаемое значение этого метода имеет тип InetSocketAddress. Если установлен менеджер безопасности, его метод checkConnect вызывается с локальным адресом и -1 в качестве аргументов, чтобы проверить разрешение операции. Если операция не разрешена, возвращается loopback адрес и локальный порт сокета канала.

Если канал привязан к адресу сокета Unix Domain, адрес сокета представляет собой UnixDomainSocketAddress. Если установлен менеджер безопасности, вызывается его метод checkPermission с NetPermission ("accessUnixDomainSocket"). Если операция не разрешена, возвращается безымянный UnixDomainSocketAddress.

Specified by:
getLocalAddress in interface NetworkChannel
Returns:
Адрес, к которому привязан сокет, или loopback адрес с локальным портом, если доступ запрещён менеджером безопасности, или null если сокет канала не привязан.
Throws:
ClosedChannelException - Если канал закрыт
IOException - Если произошла ошибка ввода-вывода

© 1993, 2021, 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/17/docs/api/java.base/java/nio/channels/SocketChannel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API