WebSocket的java實現

來源:互聯網
上載者:User

標籤:websocket   java   

 WebSocket API簡介:

首先看一段簡單的javascript代碼,該代碼調用了WebSockets的API。

[javascript] view plaincopy
  1. var ws = new WebSocket(“ws://echo.websocket.org”);  
  2.   
  3. ws.onopen = function(){ws.send(“Test!”); };  
  4.   
  5. ws.onmessage = function(evt){console.log(evt.data);ws.close();};  
  6.   
  7. ws.onclose = function(evt){console.log(“WebSocketClosed!”);};  
  8.   
  9. ws.onerror = function(evt){console.log(“WebSocketError!”);};  

這份代碼總共只有5行,現在簡單概述一下這5行代碼的意義。

第一行代碼是在申請一個WebSocket對象,參數是需要已連線的服務器端的地址,同http協議使用http://開頭一樣,WebSocket協議的URL使用ws://開頭,另外安全的WebSocket協議使用wss://開頭。

第二行到第五行為WebSocket對象註冊訊息的處理函數,WebSocket對象一共支援四個訊息 onopen, onmessage, onclose和onerror,當Browser和WebSocketServer串連成功後,會觸發onopen訊息;如果串連失敗,發送、接收資料失敗或者處理資料出現錯誤,browser會觸發onerror訊息;當Browser接收到WebSocketServer發送過來的資料時,就會觸發onmessage訊息,參數evt中包含server傳輸過來的資料;當Browser接收到WebSocketServer端發送的關閉串連請求時,就會觸發onclose訊息。我們可以看出所有的操作都是採用訊息的方式觸發的,這樣就不會阻塞UI,使得UI有更快的回應時間,得到更好的使用者體驗。


實現:

@ServerEndpoint(value = "/websocket/{random}")public class WebSocket {     private static final Set<WebSocket> connections =              new CopyOnWriteArraySet<WebSocket>();        private Session session;     private String random;      public WebSocket() {               }        /*當websocket的用戶端串連到伺服器時候,這個方法就會執行,並且傳遞一個session會話對象來      我們拿到這話session,就是可以給用戶端發送訊息*/      @OnOpen      public void start(Session session,@PathParam("random") String random) {     this.random=random;    System.out.println(random);        this.session = session;        connections.add(this);        }              /*用戶端被關閉時候,就會自動會調用這個方法*/      @OnClose      public void end() {        connections.remove(this);    }        /*用戶端給伺服器發送訊息,這個方法會自動調用,並且可以拿到發送過來的資料*/      @OnMessage      public void incoming(String message) {          // Never trust the client      //sendByIp("10.104.5.51","only to the first");    System.out.println(random+":"+message);        broadcast(message);      }        /*發生了異常自動執行*/      @OnError      public void onError(Throwable t) throws Throwable {       }        /*廣播:遍曆用戶端集,發送訊息,注意發送要用的session,用session.getBasicRemote().sendText(msg)發送訊息*/      public static void broadcast(String msg) {          for (WebSocket client : connections) {//遍曆所有              try {//如果這個client已經線上                  synchronized (client) {                      client.session.getBasicRemote().sendText(msg);//發送訊息                 }              } catch (IOException e) {//如果這個client不線上                  connections.remove(client);                  try {                      client.session.close();                  } catch (IOException e1) {                      // Ignore                  }              }          }      }}


WebSocket的java實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.