Интерфейс 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 Close ( 1000), указывающий на нормальное закрытие, что означает, что цель, для которой было установлено соединение, выполнена. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
abort() |
Резко закрывает вход и выход этого WebSocket. |
String |
getSubprotocol() |
Возвращает подпротокол, используемый этим WebSocket. |
boolean |
isOutputClosed() |
Указывает, закрыт ли вход этого WebSocket. |
boolean |
isOutputClosed() |
Указывает, закрыт ли выход этого WebSocket. |
void |
request |
Увеличивает счетчик вызовов методов получения. |
CompletableFuture<WebSocket> |
sendBinary |
Отправляет двоичные данные с байтами из заданного буфера. |
CompletableFuture<WebSocket> |
sendClose |
Инициирует упорядоченное закрытие вывода этого WebSocket, отправив сообщение Close со заданным кодом состояния и причиной. |
CompletableFuture<WebSocket> |
sendPing |
Отправляет сообщение Ping с байтами из заданного буфера. |
CompletableFuture<WebSocket> |
sendPong |
Отправляет сообщение Pong с байтами из заданного буфера. |
CompletableFuture<WebSocket> |
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соответственно. Однако, доставляются ли текстовые и двоичные сообщения в одном вызове методов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, 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.net.http/java/net/http/WebSocket.html