這個項目包含使用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