java開發-WebSocket長鏈接

基礎內容

這個項目包含使用100%Java編寫的準系統WebSocket服務器和客戶端實現。 底層類是java.nio實現的,它容許非阻塞事件驅動模型(相似於Web瀏覽器的WebSocket API)。html

視點1:java

    WebSocket 協議在2008年誕生,2011年成爲國際標準。全部瀏覽器都已經支持了。git

它的最大特色就是,服務器能夠主動向客戶端推送信息,客戶端也能夠主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。【3】github

    WebSocket解決了瀏覽器客戶端-服務器通訊低效(低速、低效)的問題,提供了一種高效的長鏈接通訊模式。web

視點2:後端

咱們知道,傳統的HTTP協議是無狀態的,每次請求(request)都要由客戶端(如 瀏覽器)主動發起,服務端進行處理後返回response結果,而服務端很難主動向客戶端發送數據;這種客戶端是主動方,服務端是被動方的傳統Web模式 對於信息變化不頻繁的Web應用來講形成的麻煩較小,而對於涉及實時信息的Web應用卻帶來了很大的不便,如帶有即時通訊、實時數據、訂閱推送等功能的應 用。在WebSocket規範提出以前,開發人員若要實現這些實時性較強的功能,常常會使用折衷的解決方法:輪詢(polling)和Comet技術。其實後者本質上也是一種輪詢,只不過有所改進。瀏覽器

輪詢是最原始的實現實時Web應用的解決方案。輪詢技術要求客戶端以設定的時間間隔週期性地向服務端發送請求,頻繁地查詢是否有新的數據改動。明顯地,這種方法會致使過多沒必要要的請求,浪費流量和服務器資源。【4】服務器

 

代碼部分

S1.添加到項目websocket

下載Java-WebSocket-1.3.8.jar包socket

https://github.com/TooTallNate/Java-WebSocket/releases  

添加Java-WebSocket-1.3.8.jar包或直接添加源碼到工程libs目錄,add as library;

 

S2.使用

//1.參考官方提供的示例example

//2.實用範例

//建立WebSocketService

/**

 * WebSocket service 服務端

 *  https://github.com/TooTallNate/Java-WebSocket

 */

public class WebSocketService extends WebSocketServer {

    private static int counter = 0;

 

    public WebSocketService(int port, Draft d) throws UnknownHostException {

        super(new InetSocketAddress(port), Collections.singletonList(d));

    }

 

    public WebSocketService(InetSocketAddress address, Draft d) {

        super(address, Collections.singletonList(d));

    }

 

    @Override

    public void onOpen(WebSocket conn, ClientHandshake handshake) {

        counter++;

        System.out.print("WebSocket Opened connection number" + counter);

        System.out.print("WebSocket onOpen:" + conn.getRemoteSocketAddress().getAddress().getHostAddress());

    }

 

    @Override

    public void onClose(WebSocket conn, int code, String reason, boolean remote) {

        System.out.print("WebSocket closed:" + conn.getRemoteSocketAddress().getAddress().getHostAddress());

    }

 

    @Override

    public void onError(WebSocket conn, Exception ex) {

        ex.printStackTrace();

        System.out.print("WebSocket Error:" + ex.getMessage());

    }

 

    @Override

    public void onStart() {

        System.out.print("WebSocket Server started!");

    }

 

    @Override

    public void onMessage(WebSocket conn, String message) {

        conn.send(message);

    }

 

    @Override

    public void onMessage(WebSocket conn, ByteBuffer blob) {

        conn.send(blob);

    }

 

    @Override

    public void onWebsocketMessageFragment(WebSocket conn, Framedata frame) {

        FramedataImpl1 builder = (FramedataImpl1) frame;

        builder.setTransferemasked(false);

        conn.sendFrame(frame);

    }

}

//啓動WebSocketService

        WebSocketService webSocketService = null;

        try {

            webSocketService = new WebSocketService(9002, new Draft_6455());

            webSocketService.setConnectionLostTimeout(0);

            webSocketService.start();

        } catch (UnknownHostException e) {

            e.printStackTrace();

        }

 

 

//客戶端js

var ws = new WebSocket("wss://echo.websocket.org");

 

ws.onopen = function(evt) {

  console.log("Connection open ...");

  ws.send("Hello WebSockets!");

};

 

ws.onmessage = function(evt) {

  console.log( "Received Message: " + evt.data);

  ws.close();

};

 

ws.onclose = function(evt) {

  console.log("Connection closed.");

}; 

 

 

 

Ref:

1. https://github.com/TooTallNate/Java-WebSocket  

2. https://github.com/TooTallNate/Java-WebSocket/releases  

3. http://www.ruanyifeng.com/blog/2017/05/websocket.html

4. Java後端WebSocket的Tomcat實現

5. java中websocket的應用

相關文章
相關標籤/搜索