-
- Enclosing interface:
- WebSocket
public static interface WebSocket.Listener
接收界面为WebSocket
。WebSocket
调用关联侦听器的方法,将其自身作为参数传递。 以线程安全的方式调用这些方法,以便下一个调用可以仅在前一个调用完成之后开始。收到数据后,
WebSocket
调用receive方法。 方法onText
,onBinary
,onPing
和onPong
必须返回一个CompletionStage
一旦消息已被监听收到的完成。 如果侦听器的方法返回null
而不是CompletionStage
,则WebSocket
行为就像侦听器返回已正常完成的CompletionStage
。在
IOException
引发的WebSocket
将导致调用onError
并具有该异常(如果输入未关闭)。 除非另有说明,否则如果侦听器的方法抛出异常或从方法返回的CompletionStage
异常完成,则WebSocket将使用此异常调用onError
。- API Note:
-
从
WebSocket
到Listener
的严格顺序调用意味着Listener
的方法被视为不可重入。 这意味着Listener
实现不需要关心可能的递归或它们WebSocket.request
于其处理逻辑调用WebSocket.request
的顺序。如果听众与多个
WebSocket
相关联,则可能需要特别注意。 在这种情况下,与WebSocket
不同实例相关的调用可能不会被排序,甚至可能同时发生。CompletionStage
从接收方法返回■找无关的counter of invocations 。 也就是说,不必完成CompletionStage
以便接收更多监听器方法的调用。 下面是一个侦听器的示例,一次一个地请求调用,直到累积完整的消息,然后处理结果,并完成CompletionStage
:WebSocket.Listener listener = new WebSocket.Listener() { List<CharSequence> parts = new ArrayList<>(); CompletableFuture<?> accumulatedMessage = new CompletableFuture<>(); public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) { parts.add(message); webSocket.request(1); if (last) { processWholeText(parts); parts = new ArrayList<>(); accumulatedMessage.complete(null); CompletionStage<?> cf = accumulatedMessage; accumulatedMessage = new CompletableFuture<>(); return cf; } return accumulatedMessage; } ... }
- 从以下版本开始:
- 11
-
-
方法摘要
所有方法 实例方法 Default Methods 变量和类型 方法 描述 default CompletionStage<?>
onBinary(WebSocket webSocket, ByteBuffer data, boolean last)
已收到二进制数据。default CompletionStage<?>
onClose(WebSocket webSocket, int statusCode, String reason)
收到一条Close消息,指示WebSocket的输入已关闭。default void
onError(WebSocket webSocket, Throwable error)
发生了错误。default void
onOpen(WebSocket webSocket)
已连接WebSocket
。default CompletionStage<?>
onPing(WebSocket webSocket, ByteBuffer message)
已收到Ping消息。default CompletionStage<?>
onPong(WebSocket webSocket, ByteBuffer message)
已收到Pong消息。default CompletionStage<?>
onText(WebSocket webSocket, CharSequence data, boolean last)
已收到文本数据。
-
-
-
方法详细信息
-
onOpen
default void onOpen(WebSocket webSocket)
已连接WebSocket
。这是初始调用,只进行一次。 它通常用于请求更多调用。
- 实现要求:
-
默认实现相当于:
webSocket.request(1);
- 参数
-
webSocket
- 已连接的WebSocket
-
onText
default CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last)
已收到文本数据。返回
CompletionStage
将由使用WebSocket
作为指示它可能回收CharSequence
。 在CompletionStage
完成后,请勿访问CharSequence
。- 实现要求:
-
默认实现相当于:
webSocket.request(1); return null;
- Implementation Note:
-
data
始终是合法的UTF-16序列。 - 参数
-
webSocket
- 已接收数据的WebSocket -
data
- 数据 -
last
- 此调用是否完成消息 - 结果
-
CompletionStage
,当CharSequence
可以回收时完成; 或null
如果它可以立即回收
-
onBinary
default CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer data, boolean last)
已收到二进制数据。此数据位于从缓冲区位置到其限制的字节中。
返回
CompletionStage
将由使用WebSocket
作为指示它可能回收ByteBuffer
。 在此CompletionStage
完成后,请勿访问ByteBuffer
。- 实现要求:
-
默认实现相当于:
webSocket.request(1); return null;
- 参数
-
webSocket
- 已接收数据的WebSocket -
data
- 数据 -
last
- 此调用是否完成消息 - 结果
-
CompletionStage
,当ByteBuffer
可以回收时完成; 或null
如果可以立即回收
-
onPing
default CompletionStage<?> onPing(WebSocket webSocket, ByteBuffer message)
已收到Ping消息。由WebSocket协议保证,消息包含不超过
125
字节。 这些字节位于缓冲区的位置到其限制。鉴于在收到ping时WebSocket实现将自动发送一个互惠的pong,很少需要在收到ping时显式发送pong消息。
返回
CompletionStage
将由使用WebSocket
,因为它可能回收的信号ByteBuffer
。 在CompletionStage
完成之后,请勿访问ByteBuffer
。- 实现要求:
-
默认实现相当于:
webSocket.request(1); return null;
- 参数
-
webSocket
- 已收到消息的WebSocket -
message
- 消息 - 结果
-
CompletionStage
,当ByteBuffer
可以回收时完成; 或null
如果可以立即回收
-
onPong
default CompletionStage<?> onPong(WebSocket webSocket, ByteBuffer message)
已收到Pong消息。由WebSocket协议保证,消息包含不超过
125
字节。 这些字节位于缓冲区的位置到其限制。返回
CompletionStage
,它将被WebSocket
用作可能回收ByteBuffer
的信号。 在此CompletionStage
完成后,请勿访问ByteBuffer
。- 实现要求:
-
默认实现相当于:
webSocket.request(1); return null;
- 参数
-
webSocket
- 已收到消息的WebSocket -
message
- 信息 - 结果
-
CompletionStage
,当ByteBuffer
可以回收时完成; 或null
如果可以立即回收
-
onClose
default CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason)
收到一条Close消息,指示WebSocket的输入已关闭。这是指定的
WebSocket
的最后一次调用。 到此调用开始时,WebSocket的输入将被关闭。关闭消息由状态代码和关闭原因组成。 状态代码是
1000 <= code <= 65535
范围内的整数。reason
是一个字符串,其UTF-8表示不超过123
字节。如果WebSocket的输出尚未关闭,则此方法返回的
CompletionStage
将用作指示WebSocket的输出可能已关闭。 WebSocket将在返回的CompletionStage
最早完成时关闭其输出,或者调用sendClose
或abort
方法中的任何一个。- API Note:
-
返回永不完成的
CompletionStage
,有效地禁用输出的往复关闭。要指定自定义闭包代码或原因代码,可以从
onClose
调用内部调用sendClose
方法:public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) { webSocket.sendClose(CUSTOM_STATUS_CODE, CUSTOM_REASON); return new CompletableFuture<Void>(); }
- 实现要求:
-
此方法的默认实现返回
null
,表示应立即关闭输出。 - 参数
-
webSocket
- 已收到消息的WebSocket -
statusCode
- 状态码 -
reason
- 原因 - 结果
-
CompletionStage
,当WebSocket
可能关闭时完成; 或null
如果它可能立即关闭
-
-