websocket web 實現記錄

dns007發表於2015-10-13

websocket 原理簡介:

WebSocket protocol 是HTML5一種新的協議(protocol)。它是實現了瀏覽器與伺服器全雙工通訊(full-duplex)。 
現很多網站為了實現即時通訊(real-time),所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(time interval)(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客服端的瀏覽器。這種傳統的HTTP request d的模式帶來很明顯的缺點 – 瀏覽器需要不斷的向伺服器發出請求(request),然而HTTP request 的header是非常長的,裡面包含的資料可能只是一個很小的值,這樣會佔用很多的頻寬。 
而最比較新的技術去做輪詢的效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通訊,但依然需要發出請求(reuqest)。 
在 WebSocket API,瀏覽器和伺服器只需要要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。在此WebSocket 協議中,為我們實現即時服務帶來了兩大好處: 
1. Header 
互相溝通的Header是很小的-大概只有 2 Bytes 
2. Server Push 
伺服器可以主動傳送資料給客戶端

WebSocket 規範的目標是在瀏覽器中實現和伺服器端雙向通訊。雙向通訊可以擴充瀏覽器上的應用型別,例如實時的資料推送(股票行情)、遊戲、聊天等。 

Ajax、Comet與Websocket 三種技術對比

實現方式:

Oracle釋出了JSR356規範,WebSocket的Java API得到了統一(之前都是基於容器(Tomcat,Jetty)的實現),所以只要Web容器支援JSR356,那麼我們寫WebSocket時,程式碼都是一樣的了.Tomcat從7.0.47開始支援JSR356.另外有一點要說明的是JDK的要求是7及以上
java7的websocket只需要配置endpoint,頁面的JS就可以連線上,無需servlet或其他配置,只需注意下url,程式碼實現相當簡單
伺服器端程式碼實現:

package com.test.websockets;
 
import java.io.IOException;
 
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint("/websocket")
public class WebSocketTest {
 
  @OnMessage
  public void onMessage(String message, Session session)
    throws IOException, InterruptedException {
   
    // Print the client message for testing purposes
    System.out.println("Received: " + message);
   
    // Send the first message to the client
    session.getBasicRemote().sendText("This is the first server message");
   
    // Send 3 messages to the client every 5 seconds
    int sentMessages = 0;
    while(sentMessages < 3){
      Thread.sleep(5000);
      session.getBasicRemote().
        sendText("This is an intermediate server message. Count: "
          + sentMessages);
      sentMessages++;
    }
   
    // Send a final message to the client
    session.getBasicRemote().sendText("This is the last server message");
  }
   
  @OnOpen
  public void onOpen() {
    System.out.println("Client connected");
  }
 
  @OnClose
  public void onClose() {
    System.out.println("Connection closed");
  }
}

參考資料:

http://www.oschina.net/translate/java-ee-html5-websocket-example

https://www.websocket.org/index.html

http://blog.csdn.net/yl02520/article/details/7298309

相關文章