Класс 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
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract SocketChannel |
bind |
Связывает сокет канала с локальным адресом. |
abstract boolean |
connect |
Подключает сокет этого канала. |
abstract boolean |
finishConnect() |
Завершает процесс подключения сокета канала. |
abstract SocketAddress |
getLocalAddress() |
Возвращает адрес сокета, к которому привязан сокет этого канала. |
abstract SocketAddress |
getRemoteAddress() |
Возвращает удалённый адрес, к которому подключен сокет этого канала. |
abstract boolean |
isConnected() |
Указывает, подключен ли сетевой сокет этого канала. |
abstract boolean |
isConnectionPending() |
Указывает, выполняется ли операция подключения на этом канале. |
static SocketChannel |
open() |
Открывает сокет-канал для сокета протокола Интернет. |
static SocketChannel |
open |
Открывает сокет-канал. |
static SocketChannel |
open |
Открывает сокет-канал и подключает его к удалённому адресу. |
abstract int |
read |
Читает последовательность байтов из этого канала в указанный буфер. |
final long |
read |
Читает последовательность байтов из этого канала в указанные буферы. |
abstract long |
read |
Читает последовательность байтов из этого канала в подпоследовательность заданных буферов. |
abstract <T> SocketChannel |
setOption |
Устанавливает значение опции сокета. |
abstract SocketChannel |
shutdownInput() |
Завершает подключение для чтения без закрытия канала. |
abstract SocketChannel |
shutdownOutput() |
Завершает подключение для записи без закрытия канала. |
abstract Socket |
socket() |
Получает сокет, связанный с этим каналом. |
final int |
validOps() |
Возвращает набор операций, определяющий поддерживаемые операции этого канала. |
abstract int |
write |
Записывает последовательность байтов в этот канал из заданного буфера. |
final long |
write |
Записывает последовательность байтов в этот канал из заданных буферов. |
abstract long |
write |
Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов. |
Методы, объявленные в классе 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.NetworkChannel
getOption, supportedOptions
Подробное описание конструкторов
SocketChannel
protected SocketChannel(SelectorProvider provider)
- Параметры:
-
provider- Поставщик, создавший этот канал
Подробное описание методов
open
public static SocketChannel open() throws IOException
Новый канал создается путем вызова метода openSocketChannel глобального системного объекта SelectorProvider.
- Возвращает:
- Новый сокет-канал
- Исключения:
-
IOException- Если произошла ошибка ввода-вывода - См. также:
open
public static SocketChannel open(ProtocolFamily family) throws IOException
family определяет protocol family сокета канала. Новый канал создается путем вызова метода openSocketChannel(ProtocolFamily) глобального системного. SelectorProvider объекта.
- Параметры:
-
family- Семейство протоколов - Возвращает:
- Новый сокет-канал
- Исключения:
-
UnsupportedOperationException- Если указанное семейство протоколов не поддерживается. Например, если параметр задан какStandardProtocolFamily.INET6, но IPv6 не включен в платформе. -
IOException- Если произошла ошибка ввода-вывода - См. также:
- 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- Если произошла какая-либо другая ошибка ввода-вывода - См. также:
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"). - См. также:
- 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- Если произошла ошибка ввода-вывода - См. также:
- 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:
-
getLocalAddressin interfaceNetworkChannel - 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