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... 版權聲明:本文爲博主原創文章,轉載請附上博文連接!