乐趣区

WebSocket消息类型-入门篇三

websocker 实现通讯基础(消息类型,消息转码 / 解码基础)
WebSocket 协议支持三种本地消息类型

1、文本消息 2、二进制消息 3、Ping 消息 和 Pong 消息

无论是注解式端点还是变成是端点,实现其发送消息的 API 都是相同的

RemoteEndPoint 接口和他的子类 RemoteEndPoint.Basic(同步发送) 和  RemoteEndpoint.Async(异步发送) 提供了发送消息的所有方法


Ping 和 Pong 消息的作用:

1)两种消息通常被用来检查 WebSocket 连接的健康性,(连接是否有效)。2)可以通过测量 Ping 和 Pong 消息所花费的时间来测算 WebSocket 连接的效率。

消息发送(同步发送)

同步发送机制是由 RemoteEndPoint 接口的子类 RemoteEndPoint.Basic 实现同步发送消息的所有方法。

RemoteEndPoint.Basic API 提供了三种发送字符串的方法

第一种:

该方法把传入的文本参数发送 WebSocket 文本信息发送,这意味着 WebSocket 连接的另一端将接受一个文本格式的信息,

只有在消息发送成功或者消息发送过程中抛出错误时,该方法才会返回(异常返回:发送过程中连接断开)

方法:public void sendText(String var1) throws IOException;

第二种

WebSocket 提供了一种使用 WriterAPI 发送 String 消息的方式(用于将一些高层级的对象序列化 String 以便发送)

方法:public Writer getSendWriter() throws IOException;

第三种

WebSocket 协议允许把大的 WebSocket 消息分解成多个小片段,使实现在整个消息被完全传送之前开始发送消息,并获得性能优化。(分片发送)

方法:public void sendText(String var1, boolean var2) throws IOException; //var2 是消息结束标识,如果消息未结束则为 false,如果消息为最后消息片段则为 true。

RemoteEndPoint.Basic API 提供了三种发送二进制消息的方法

第一种

和第一种发送字符串方法一样,一次发送完整信息,只有在消息完全发送成功,或者发送过程中抛出异常才会返回。

方法:public void sendBinary(ByteBuffer var1) throws IOException;

第二种

分片发送二进制消息

方法:public void sendBinary(ByteBuffer var1, boolean var2) throws IOException; /var2 是消息结束标识,如果消息未结束则为 false,如果消息为最后消息片段则为 true。

第三种

实现通过输出流来发送消息,如果直接将 java 对象写入 Java I/ O 的 API 时,这种方式将变得非常有用。

方法:public OutputStream getSendStream() throws IOException;

WebSocket 是怎么将对象变为 WebSocket 信息的?

1)如果你传入的是一个 java 基本类型(等值于一个装箱类),WebSocket 实际上会把数据转化成一个标准的 Java 字符串。

2)如果传入的是其他对象(除 String 类型),WebSocket 会实现 javax.websocket.Encoder.Text<T> T 就是你想要发送的对象类型。

    当你使用 WebSocket 发送 T 类型的对象时,WebSocket 会调用相应的解码器,发送给远端的实际上是 encode() 方法返回的字符串。当编码器无法进行转换时就会抛出 EncodeException 异常。传入其他对象(除 String 类型)实现:一、如果想把对象编码成 WebSocket 二进制信息,可以实现 Encoder.Binary<T> 接口。二、如果想把对象编码成 Java I/ O 流,可以实现 Encoder.CharacterStream<T>、Encoder.BinaryStream<T> 


注意:

1)要自己定义编码器,将信息编码为自己要传输的格式

案例:public class DrawingEncoder implements Encoder.Text<DrawingObject> {} // 编码器:将 DrawingObject 转化为 String 类型

2)同时要在服务器端点配置定义的编码器。

@ServerEndpoint(

    value= "/fruit_tree",
    encoders = {DrawingEncoder.class}

)

编码器:Encoder

编码器接口类型:

 编码接口                                            转换                                                    主要方法

Encoder.Text<T> T 转换成 String 类型 String encode(T object)

Encoder.TextStream<T> T 转换成 Writer void encode(T object,Writer writer)

Encoder.Binary<T> T 转换成 ByteBuffer ByteBuffer encode(T object)

Encoder.BinaryStream<T> T 转换成 OutputStream void encode(T object,OutputStream os)

消息接收

消息接收方法及其参数类型

参数类型 处理消息类型 方法示例

String 文本消息 public void handleMessage(String Message) {}

String、boolean 文本消息片段 public void handleMessage(String Message,boolean isLast) {}

Reader 文本消息流 public void handleMessage(Reader Message) {}

byte[] 二进制消息 public void handleMessage(byte[] data) {}

ByteBuffer 二进制消息 public void handleMessage(ByteBuffer data) {}

byte[],boolean 二进制消息片段 public void handleMessage(byte[] data,boolean isLast) {}

ByteBuffer,boolean 二进制消息片段 public void handleMessage(ByteBuffer data,boolean isLast) {}

PongMessage Pong 消息 public void handleMessage(PongMessage Message) {}

除了接收上面的消息类型,还可以接收 java 定义的类,但是要先为类型定义好解码器

解码器:Decoder

解码器接口类型

Decoder.Text<T> T 转换成 String 类型 T decode(String raw)

Decoder.TextStream<T> T 转换成 Writer T decode(Reader raw)

Decoder.Binar<T> T 转换成 ByteBuffer T decode(ByteBuffer raw)

Decoder.BinaryStream<T> T 转换成 OutputStream T decode(InputStream raw)

WebSocket 消息处理有非常严格的限定,每个注解式端点最多只有一个消息处理方法处理每种本地消息类型。


作者:Mark_XC
来源:CSDN
原文:https://blog.csdn.net/Mark_Ch…
版权声明:本文为博主原创文章,转载请附上博文链接!

退出移动版