基礎內容
這個項目包含使用100%Java編寫的准系統WebSocket服務器和客戶端實現。 底層類是java.nio實現的,它允許非阻塞事件驅動模型(類似於Web瀏覽器的WebSocket API)。
視點1:
WebSocket 協議在2008年誕生,2011年成為國際標准。所有瀏覽器都已經支持了。
它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。【3】
WebSocket解決了瀏覽器客戶端-服務器通信低效(低速、低效)的問題,提供了一種高效的長連接通信模式。
視點2:
我們知道,傳統的HTTP協議是無狀態的,每次請求(request)都要由客戶端(如 瀏覽器)主動發起,服務端進行處理后返回response結果,而服務端很難主動向客戶端發送數據;這種客戶端是主動方,服務端是被動方的傳統Web模式 對於信息變化不頻繁的Web應用來說造成的麻煩較小,而對於涉及實時信息的Web應用卻帶來了很大的不便,如帶有即時通信、實時數據、訂閱推送等功能的應 用。在WebSocket規范提出之前,開發人員若要實現這些實時性較強的功能,經常會使用折衷的解決方法:輪詢(polling)和Comet技術。其實后者本質上也是一種輪詢,只不過有所改進。
輪詢是最原始的實現實時Web應用的解決方案。輪詢技術要求客戶端以設定的時間間隔周期性地向服務端發送請求,頻繁地查詢是否有新的數據改動。明顯地,這種方法會導致過多不必要的請求,浪費流量和服務器資源。【4】
代碼部分
S1.添加到項目
下載Java-WebSocket-1.3.8.jar包
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
