WebSocket消息类型 入门篇(三)

WebSocket实现通讯基础(消息类型,消息转码/解码基础)

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 消息处理有非常严格的限定,每个注解式端点最多只有一个消息处理方法处理每种本地消息类型。

 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值