Интерфейс 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в противном случае - Возвращает:
- a
CompletableFutureкоторый завершается с этим WebSocket, когда данные были отправлены
sendBinary
CompletableFuture<WebSocket> sendBinary(ByteBuffer data, boolean last)
Данные расположены в байтах от позиции буфера до его предела. При нормальном завершении CompletableFuture возвращаемого из этого метода в буфере не останется байтов. К буферу нельзя обращаться до завершения.
CompletableFuture возвращаемого из этого метода может завершиться исключительным образом с:
-
IllegalStateException- если есть ожидающая операция отправки текста или двоичных данных, или если предыдущие текстовые данные не завершают сообщение -
IOException- если произошла ошибка ввода-вывода или если выход закрыт
- Параметры:
-
data- данные -
last-trueесли это вызов завершает сообщение,falseв противном случае - Возвращает:
- a
CompletableFutureкоторый завершается с этим WebSocket, когда данные были отправлены
sendPing
CompletableFuture<WebSocket> sendPing(ByteBuffer message)
Сообщение состоит не более чем из 125 байтов от позиции буфера до его предела. При нормальном завершении CompletableFuture возвращаемого из этого метода в буфере не останется байтов. К буферу нельзя обращаться до завершения.
CompletableFuture возвращаемого из этого метода может завершиться исключительным образом с:
-
IllegalStateException- если есть ожидающая операция отправки ping или pong -
IllegalArgumentException- если сообщение слишком длинное -
IOException- если произошла ошибка ввода-вывода или если выход закрыт
- Параметры:
-
message- сообщение - Возвращает:
- a
CompletableFutureкоторый завершается с этим WebSocket, когда сообщение Ping было отправлено
sendPong
CompletableFuture<WebSocket> sendPong(ByteBuffer message)
Сообщение состоит не более чем из 125 байтов от позиции буфера до его предела. При нормальном завершении CompletableFuture возвращаемого из этого метода в буфере не останется байтов. К буферу нельзя обращаться до завершения.
Учитывая, что реализация WebSocket автоматически отправляет ответный pong при получении ping, редко требуется явно отправлять сообщение pong.
CompletableFuture возвращаемого из этого метода может завершиться исключительным образом с:
-
IllegalStateException- если есть ожидающая операция отправки ping или pong -
IllegalArgumentException- если сообщение слишком длинное -
IOException- если произошла ошибка ввода-вывода или если выход закрыт
- Параметры:
-
message- сообщение - Возвращает:
- a
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- причина - Возвращает:
- a
CompletableFutureкоторый завершается с этим WebSocket, когда сообщение Close было отправлено
request
void request(long n)
Этот WebSocket вызовет onText, onBinary, onPing, onPong или onClose методы связанного слушателя (т.е. методы приема) до n раз.
- Примечание API:
- Параметр этого метода - количество запрошенных вызовов от этого WebSocket к связанному слушателю, а не количество сообщений. Иногда сообщение может быть передано слушателю в одном вызове, но не всегда. Например, сообщения Ping, Pong и Close передаются в одном вызове методов
onPing,onPongиonCloseсоответственно. Однако то, будут ли текстовые и двоичные сообщения переданы в одном вызове методов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, 2023, 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/21/docs/api/java.net.http/java/net/http/WebSocket.html