websocker实现通信基础(消息类型,消息转码/解码基础)
WebSocket协议支持三种本地消息类型java
一、文本消息 二、二进制消息 三、Ping消息 和 Pong消息 web
不管是注解式端点仍是变成是端点,实现其发送消息的API都是相同的性能优化
RemoteEndPoint接口和他的子类RemoteEndPoint.Basic(同步发送) 和 RemoteEndpoint.Async(异步发送) 提供了发送消息的全部方法
Ping 和 Pong消息的做用:服务器
1)两种消息一般被用来检查WebSocket链接的健康性,(链接是否有效)。 2)能够经过测量Ping和Pong消息所花费的时间来测算WebSocket链接的效率。
消息发送(同步发送)websocket
同步发送机制是由RemoteEndPoint接口的子类RemoteEndPoint.Basic实现同步发送消息的全部方法。异步
RemoteEndPoint.Basic API提供了三种发送字符串的方法socket
第一种:性能
该方法把传入的文本参数发送WebSocket文本信息发送,这意味着WebSocket链接的另外一端将接受一个文本格式的信息,优化
只有在消息发送成功或者消息发送过程当中抛出错误时,该方法才会返回(异常返回:发送过程当中链接断开)ui
方法: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类型)实现: 1、若是想把对象编码成WebSocket二进制信息,能够实现Encoder.Binary<T>接口。 2、若是想把对象编码成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... 版权声明:本文为博主原创文章,转载请附上博文连接!