Интерфейс WebSocket
public interface WebSocket
WebSocket экземпляры создаются через WebSocket.Builder.
WebSocket имеет входную и выходную стороны. Эти стороны независимы друг от друга. Сторона может быть открытой или закрытой. После закрытия сторона остается закрытой. Сообщения WebSocket отправляются через WebSocket и принимаются через связанный с ним WebSocket.Listener. Сообщения могут отправляться до закрытия выходной стороны WebSocket и приниматься до закрытия входной стороны WebSocket.
Метод отправки — это любой из методов sendText, sendBinary, sendPing, sendPong и sendClose интерфейса WebSocket. Метод отправки инициирует операцию отправки и возвращает CompletableFuture, которая завершается после завершения операции. Если CompletableFuture завершается нормально, операция считается успешной. Если CompletableFuture завершается с ошибкой, операция считается неудачной. Операция, которая была инициирована, но еще не завершена, считается ожидающей.
Метод приема — это любой из методов onText, onBinary, onPing, onPong и onClose интерфейса Listener. WebSocket инициирует операцию приема, вызывая метод приема в обработчике. Затем обработчик должен вернуть CompletionStage, который завершается после завершения операции.
Для управления приемом сообщений WebSocket поддерживает внутренний счетчик. Значение этого счетчика — количество раз, когда WebSocket еще должен вызвать метод приема. Пока этот счетчик равен нулю, WebSocket не вызывает методы приема. Счетчик увеличивается на n при вызове request(n). Счетчик уменьшается на единицу, когда WebSocket вызывает метод приема. onOpen и onError не являются методами приема. WebSocket вызывает onOpen перед любыми другими методами в обработчике. WebSocket вызывает onOpen не более одного раза. WebSocket может вызвать onError в любое время. Если WebSocket вызывает onError или onClose, то дальнейшие методы обработчика не будут вызваны, независимо от значения счетчика. Для только что созданного WebSocket счетчик равен нулю.
Если не указано иное, null аргументы заставят методы WebSocket выбрасывать NullPointerException, аналогично, WebSocket не будет передавать null аргументы методам Listener. Состояние WebSocket не изменяется при вызовах, которые выбрасывают или возвращают CompletableFuture, завершающееся с помощью одного из исключений NullPointerException, IllegalArgumentException, IllegalStateException.
WebSocket обрабатывает полученные сообщения Ping и Close автоматически (согласно протоколу WebSocket), отвечая сообщениями Pong и Close. Если обработчик получает сообщения Ping или Close, от него не требуется никаких обязательных действий.
- Замечание по API:
- Отношение между WebSocket и связанным с ним обработчиком аналогично отношению подписки и связанного подписчика типа
Flow. - С:
- 11
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
WebSocket.Builder |
Построитель клиентов WebSocket. |
static interface |
WebSocket.Listener |
Интерфейс приема WebSocket. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
NORMAL_CLOSURE |
Код состояния сообщения закрытия WebSocket ( 1000), указывающий на нормальное закрытие, означающее, что цель, для которой было установлено соединение, выполнена. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
abort() |
Резко закрывает вход и выход этого WebSocket. |
String |
getSubprotocol() |
Возвращает используемый этим WebSocket подпротокол. |
boolean |
isInputClosed() |
Указывает, закрыт ли вход этого WebSocket. |
boolean |
isOutputClosed() |
Указывает, закрыт ли выход этого WebSocket. |
void |
request |
Увеличивает счетчик вызовов методов приема. |
CompletableFuture |
sendBinary |
Отправляет двоичные данные с байтами из заданного буфера. |
CompletableFuture |
sendClose |
Инициирует упорядоченное закрытие выходной стороны этого WebSocket, отправив сообщение Close со заданным кодом состояния и причиной. |
CompletableFuture |
sendPing |
Отправляет сообщение Ping с байтами из заданного буфера. |
CompletableFuture |
sendPong |
Отправляет сообщение Pong с байтами из заданного буфера. |
CompletableFuture |
sendText |
Отправляет текстовые данные с символами из заданной последовательности символов. |
Подробное описание полей
NORMAL_CLOSURE
static final int NORMAL_CLOSURE
1000), указывающий на нормальное завершение, означающее, что цель, для которой было установлено соединение, выполнена.- См. также:
Подробное описание методов
sendText
CompletableFuture<WebSocket> sendText(CharSequence data, boolean last)
Последовательность символов не должна изменяться до завершения CompletableFuture, возвращенного этим методом.
Возвращаемое CompletableFuture этим методом может завершиться исключением:
-
IllegalStateException- если существует ожидающая операция отправки текста или двоичных данных или если предыдущие двоичные данные не завершают сообщение -
IOException- если произошла ошибка ввода-вывода или если вывод закрыт
- Примечание реализации:
- Если
dataявляется некорректной последовательностью UTF-16, операция завершится ошибкойIOException. - Параметры:
-
data- данные -
last-trueесли это вызов завершает сообщение,falseв противном случае - Возвращает:
CompletableFuture, завершающий работу с этим WebSocket, когда данные будут отправлены
sendBinary
CompletableFuture<WebSocket> sendBinary(ByteBuffer data, boolean last)
Данные находятся в байтах от позиции буфера до его предела. По завершении CompletableFuture, возвращаемого этим методом, в буфере не будет оставшихся байтов. К буферу нельзя обращаться до этого момента.
CompletableFuture, возвращаемый этим методом, может завершиться исключением:
-
IllegalStateException- если существует ожидающая операция отправки текста или двоичных данных или если предыдущие текстовые данные не завершают сообщение -
IOException- если произошла ошибка ввода-вывода или если вывод закрыт
- Параметры:
-
data- данные -
last-trueесли этот вызов завершает сообщение,falseв противном случае - Возвращает:
CompletableFuture, завершающий работу с этим WebSocket, когда данные будут отправлены
sendPing
CompletableFuture<WebSocket> sendPing(ByteBuffer message)
Сообщение состоит не более чем из 125 байтов от позиции буфера до его предела. По завершении CompletableFuture, возвращаемого этим методом, в буфере не будет оставшихся байтов. К буферу нельзя обращаться до этого момента.
CompletableFuture, возвращаемый этим методом, может завершиться исключением:
-
IllegalStateException- если существует ожидающая операция отправки ping или pong -
IllegalArgumentException- если сообщение слишком длинное -
IOException- если произошла ошибка ввода-вывода или если вывод закрыт
- Параметры:
-
message- сообщение - Возвращает:
CompletableFuture, завершающий работу с этим WebSocket, когда сообщение Ping будет отправлено
sendPong
CompletableFuture<WebSocket> sendPong(ByteBuffer message)
Сообщение состоит не более чем из 125 байтов от позиции буфера до его предела. По завершении CompletableFuture, возвращаемого этим методом, в буфере не будет оставшихся байтов. К буферу нельзя обращаться до этого момента.
Учитывая, что реализация WebSocket автоматически отправляет взаимный pong при получении ping, редко требуется отправлять сообщение pong явно.
CompletableFuture, возвращаемый этим методом, может завершиться исключением:
-
IllegalStateException- если существует ожидающая операция отправки ping или pong -
IllegalArgumentException- если сообщение слишком длинное -
IOException- если произошла ошибка ввода-вывода или если вывод закрыт
- Параметры:
-
message- сообщение - Возвращает:
CompletableFuture, завершающий работу с этим WebSocket, когда сообщение Pong будет отправлено
sendClose
CompletableFuture<WebSocket> sendClose(int statusCode, String reason)
statusCode — целое число из диапазона 1000 <= code <= 4999. Коды состояния 1002, 1003, 1006, 1007, 1009, 1010, 1012, 1013 и 1015 являются недопустимыми. Поведение по отношению к другим кодам состояния зависит от реализации. Допустимая reason — строка, представление которой в UTF-8 не длиннее 123 байтов.
Возвращаемое CompletableFuture этим методом может завершиться исключением:
-
IllegalArgumentException- еслиstatusCodeявляется недопустимым или еслиreasonявляется недопустимым -
IOException- если произошла ошибка ввода-вывода или если вывод закрыт
Если CompletableFuture, возвращаемое этим методом, завершается с IllegalArgumentException или метод выбрасывает NullPointerException, вывод будет закрыт.
Если не закрыт, вход остается открытым до получения сообщения Close получено, или вызова abort, или возникновения ошибки ошибка.
- Примечание API:
- В типичном случае используйте предоставленную константу
NORMAL_CLOSUREв качестве кода состояния и пустую строку в качестве причины:МетодCompletableFuture<WebSocket> webSocket = ... webSocket.thenCompose(ws -> ws.sendText("Hello, ", false)) .thenCompose(ws -> ws.sendText("world!", true)) .thenCompose(ws -> ws.sendClose(WebSocket.NORMAL_CLOSURE, "")) .join();sendCloseне закрывает входной поток этого WebSocket. Он просто закрывает выходной поток этого WebSocket, отправив сообщение Close. Чтобы обеспечить закрытие ввода, вызовите методabort. Вот пример приложения, которое отправляет сообщение Close, а затем запускает таймер. После того, как в течение указанного времени ожидания не будет получено никаких данных, таймер срабатывает, и тревога прерываетWebSocket:MyAlarm alarm = new MyAlarm(webSocket::abort); WebSocket.Listener listener = new WebSocket.Listener() { public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) { alarm.snooze(); ... } ... }; ... Runnable startTimer = () -> { MyTimer idleTimer = new MyTimer(); idleTimer.add(alarm, 30, TimeUnit.SECONDS); }; webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok").thenRun(startTimer); - Параметры:
-
statusCode- код состояния -
reason- причина - Возвращает:
CompletableFuture, завершающий работу с этим WebSocket, когда сообщение Close будет отправлено
request
void request(long n)
Этот WebSocket будет вызывать onText, onBinary, onPing, onPong или onClose методы на связанном слушателе (т.е. методы получения) до n дополнительных раз.
- Примечание API:
- Параметр этого метода — количество запрошенных вызовов от этого WebSocket связанному слушателю, а не количество сообщений. Иногда сообщение может быть доставлено слушателю в одном вызове, но не всегда. Например, сообщения Ping, Pong и Close доставляются в одном вызове методов
onPing,onPongиonCloseсоответственно. Однако, будет ли сообщение Text и Binary доставляться в одном вызове методовonTextиonBinaryзависит от булевого аргумента (last) этих методов. Еслиlast—false, то в сообщении есть больше, чем было доставлено в вызов.Вот пример слушателя, который запрашивает вызовы по одному, пока не будет накоплено полное сообщение, а затем обрабатывает результат:
WebSocket.Listener listener = new WebSocket.Listener() { StringBuilder text = new StringBuilder(); public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) { text.append(message); if (last) { processCompleteTextMessage(text); text = new StringBuilder(); } webSocket.request(1); return null; } }; - Параметры:
-
n- количество вызовов - Исключения:
-
IllegalArgumentException- еслиn <= 0
getSubprotocol
String getSubprotocol()
- Возвращает:
- подпротокол или пустую строку, если подпротокол отсутствует
isOutputClosed
boolean isOutputClosed()
Если этот метод возвращает true, последующие вызовы также будут возвращать true.
- Возвращает:
-
true, если закрыт,falseв противном случае
isInputClosed
boolean isInputClosed()
Если этот метод возвращает true, последующие вызовы также будут возвращать true.
- Возвращает:
-
true, если закрыт,falseв противном случае
abort
void abort()
Когда этот метод возвращается, и входной, и выходной потоки будут закрыты. Любые ожидающие операции отправки завершатся с ошибкой IOException. Последующие вызовы метода abort не будут иметь эффекта.
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.net.http/java/net/http/WebSocket.html