Интерфейс 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 и соответствующим ему Listener аналогична связи между Subscription и соответствующим Subscriber типа
Flow. - С версии:
- 11
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
WebSocket.Builder |
Построитель клиентов WebSocket. |
static interface |
WebSocket.Listener |
Интерфейс приёма для WebSocket. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
NORMAL_CLOSURE |
Код состояния сообщения Close 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://docs.oracle.com/en/java/javase/25/docs/api/java.net.http/java/net/http/WebSocket.html