Java API for WebSocket 實作介紹

7,716 views

Published on

Java API for WebSocket

Published in: Technology

Java API for WebSocket 實作介紹

  1. 1. 文孝義 國立中央大學資訊管理所 Ph.D 2014/3/121 Java API for WebSocket
  2. 2. 大綱 2014/3/122  簡介  類型  JAVA 平台  Server Side: Java Servlet  Client Slide: JavaScript for WebScoket
  3. 3. 簡介 2014/3/123  WebSocket 是種通訊協定,透過TCP 通訊協定提 供全工雙向通訊資料交換。  針對WWW透過HTTP建立資料交換的需求。  JSR-356  Java API for WebSocket  實作 RFC6455: The WebSocket Protocol  Apache Tomcat 8 支援  主流的瀏覽器都支援WebSocket且提供JavaScript API
  4. 4. 簡介 2014/3/124  為何要採用 WebScoket?  現有 HTTP 屬於短連接,用完即關閉。屬於無狀態 保存的通訊協定。  實務上需要能夠即時傳遞資料。  過去即時性資料交換,大多採用輪詢的方式。定時向 對方建立連線詢問。效能差,無法即時。  適用:  股市行情即時  通訊軟體,Line等。  訊息即時傳遞需要。
  5. 5. 類型 2014/3/125  WebSocket Application  Server: 發佈 WebSoocket Endpoint 提供連線端 URIs  Client: 使用 endpoint URIs來向 server 建立連線請求。  WebSocket 通訊協定在完成建立連線後既已完成雙 方對稱狀態。任一方皆可發送與接受訊息。並且可以 隨意關閉連線。 Client ServerClient Client
  6. 6. 類型 2014/3/126  WebSocket 通訊協定  Handshake: client 送出 WebSocket Endpoint URIs 進行交握機制來建立連線請求。交握機制是基於 HTTP為基礎架構上完成。  Data trandfer GET /path/to/websocket/endpoint HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== Origin: http://localhost Sec-WebSocket-Version: 13 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8 =
  7. 7. 類型 2014/3/127  支援的資料內容  文字訊息 (以UTF-8編碼)  二進制訊息,圖片、聲音或物件等。  控制框格式  Close  Ping  Pong  Ping 的回應  Ping 與 Pong 都是含有資料
  8. 8. 類型 2014/3/128  何謂 WebSocket Endpoint URIs?  ws://host:port/path?query  wss://host:port/path?query  Port 部分是可省略,預設則是80或443。  加密模式 HTTPS對應就是 wss
  9. 9. JAVA 平台 2014/3/129  Java API for WebSocket (JSR-356)  提供規範規格建立與佈署WebSocket endpoints的 Web 應用程式  WebSocket client API 規範規格提供開發應用程式向 遠端WebSocket endpoints 存取操作  javax.websocket.server 套件  提供相關類別與介面建立與設定 server 端 endpoints  javax.websocket 套件  提供 client 與 server endpoints 共通介面與類別
  10. 10. JAVA 平台 2014/3/1210  WebSocket endpoints 是 javax.websocket.Endpoint 的類別的物件實體。  JSR-356 提供兩種endpoints方式來使用API  Programmatic endpoints  繼承 Endpoint類別使用相關方法  Annotated endpoint  使用 annotations 來操作方法
  11. 11. Server Side: Java Servlet 2014/3/1211  Programmatic endpoints public class EchoEndpoint extends Endpoint { @Override public void onOpen(final Session session, EndpointConfig config) { session.addMessageHandler(new MessageHandler.Whole<String>() @Override public void onMessage(String msg) { try { session.getBasicRemote().sendText(msg); } catch (IOException e) { ... } } }); } }
  12. 12. Server Side: Java Servlet 2014/3/1212  session 參數物件  代表連線的雙方連線狀態  佈署方式  佈署後,其endpoint 如下 ServerEndpointConfig.Builder.create(EchoEndpoint.class, "/echo").build(); ws://localhost:8080/echoapp/echo
  13. 13. Server Side: Java Servlet 2014/3/1213  Annotated endpoint @ServerEndpoint("/echo") public class EchoEndpoint { @OnMessage public void onMessage(Session session, String msg) { try { session.getBasicRemote().sendText(msg); } catch (IOException e) { ... } } }
  14. 14. Server Side: Java Servlet 2014/3/1214  相關方法 Annotatio n Event 說明 OnOpen 連線已經建立與 開啟 @OnOpen public void open(Session session, EndpointConfig conf) { } OnMessa ge 收到訊息 @OnMessage public void message (Session session, String msg) { } OnError 連線錯誤 @OnError public void error(Session session, Throwable error) { } OnClose 連線已關閉 @OnClose public void close(Session session, CloseReason reason) { }
  15. 15. Client Slide: JavaScript for WebScoket 2014/3/1215  送收訊息  使用 Session 取得 RemoteEndpoint物件  Session.getBasicRemote()  取得 RemoteEndpoint.Basic 物件的 blocking 方法  Session.getAsyncRemote()  取得 RemoteEndpoint.Async 物件的non-blocking方法
  16. 16. Client Slide: JavaScript for WebScoket 2014/3/1216  送出訊息  文字訊息  void RemoteEndpoint.Basic.sendText(String text)  二進制訊息  void RemoteEndpoint.Basic.sendBinary(ByteBuffer data)  Ping 訊息  void RemoteEndpoint.sendPing(ByteBuffer appData)  Pong訊息  void RemoteEndpoint.sendPong(ByteBuffer appData)
  17. 17. Client Slide: JavaScript for WebScoket 2014/3/1217  取得全部已經連線所有session  session.getOpenSessions() @ServerEndpoint("/echoall") public class EchoAllEndpoint { @OnMessage public void onMessage(Session session, String msg) { try { for (Session sess : session.getOpenSessions()) { if (sess.isOpen()) sess.getBasicRemote().sendText(msg); } } catch (IOException e) { ... } } }
  18. 18. Client Slide: JavaScript for WebScoket 2014/3/1218  接收訊息類型 @ServerEndpoint("/receive") public class ReceiveEndpoint { @OnMessage public void textMessage(Session session, String msg) { System.out.println("Text message: " + msg); } @OnMessage public void binaryMessage(Session session, ByteBuffer msg) { System.out.println("Binary message: " + msg.toString()); } @OnMessage public void pongMessage(Session session, PongMessage msg) { System.out.println("Pong message: " + msg.getApplicationData().toString()); } }
  19. 19. Client Slide: JavaScript for WebScoket 2014/3/1219  處理 client 端狀態 @ServerEndpoint("/delayedecho") public class DelayedEchoEndpoint { @OnOpen public void open(Session session) { session.getUserProperties().put("previousMsg", " "); } @OnMessage public void message(Session session, String msg) { String prev = (String) session.getUserProperties().get("previousMsg"); session.getUserProperties().put("previousMsg", msg); try { session.getBasicRemote().sendText(prev); } catch (IOException e) { ... } } }
  20. 20. Client Slide: JavaScript for WebScoket 2014/3/1220  其他  Encoders與 Decoders  處理資料型別的轉換  Java Object to JSON/XML  Path 參數  把 URI 以參數方式處理 @ServerEndpoint("/chatrooms/{room-name}") public class ChatEndpoint { ... } http://localhost:8080/chatapp/chatrooms/currentnews
  21. 21. Client Slide: JavaScript for WebScoket 2014/3/1221 @ServerEndpoint("/chatrooms/{room-name}") public class ChatEndpoint { @OnOpen public void open(Session session,EndpointConfig c, @PathParam("room-name") String roomName) { // Add the client to the chat room of their choice ... } }
  22. 22. Client Slide: JavaScript for WebScoket 2014/3/1222  異常處理 @ServerEndpoint("/testendpoint") public class TestEndpoint { ... @OnError public void error(Session session, Throwable t) { t.printStackTrace(); ... } }
  23. 23. Client Slide: JavaScript for WebScoket 2014/3/1223  建立連線  關閉連線  委派訊息事件 var wsocket = new WebSocket("ws://localhost:8080/dukeetf2/dukeetf"); wsocket.onmessage = onMessage; function onMessage(evt) { var arraypv = evt.data.split(","); document.getElementById("price").innerHTML = arraypv[0]; document.getElementById("volume").innerHTML = arraypv[1]; } wsocket.close();
  24. 24. Client Slide: JavaScript for WebScoket 2014/3/1224  相關事件處理 wsocket.onopen = function () { setConnected(true); log('Info: WebSocket connection opened.'); }; wsocket.onmessage = function (event) { log('Received: ' + event.data); }; wsocket.onclose = function () { setConnected(false); log('Info: WebSocket connection closed.'); }; wsocket.onerror = function (er) { setConnected(false); log('Info: WebSocket connection error.‘ + er.data); };
  25. 25. 2014/3/1225 Thanks

×