1.序言前端
在工做中,咱們有時候須要使用能與前端實時通訊傳輸以通訊,這種技術就是由Socket實現的,而Socket又有短鏈接和長鏈接之分,長鏈接技術就是咱們今天要介紹的websocket。web
2.websocket服務啓動設置 websocket
首先建立一個基於HTTP協議的 jetty Servlet server,Jetty經過WebSocketServlet和servlet橋接的使用,提供了將WebSocket端點到Servlet路徑的對應。
內在地,Jetty管理HTTP升級到WebSocket,而且從一個HTTP鏈接移植到一個WebSocket鏈接。
這隻有當運行在Jetty容器內部時才工做。網絡
// 建立一個基於HTTP協議的 jetty Servlet server Server server = new Server(); // jetty網絡接口封裝,用於監聽網絡請求 ServerConnector connector = new ServerConnector(server); // 設置該server監聽端口 connector.setPort(9001); // 將網絡配置加入server容器中 server.addConnector(connector);app |
接下來,建立一個可用的webSocket對象webapp
// jetty支持的webSocket處理對象 WebSocketHandler wsHandler = new WebSocketHandler() { // 全部的webSocket建立都是經過在WebSocketServletFactory註冊的WebSocketCreator建立的 @Override public void configure(WebSocketServletFactory factory) { // 由於使用了匿名方式建立WebSocketCreator,這裏先將須要初始化類的信息告訴 // WebSocketServletFactory,這個環節也能夠經過預先定製(建立)WebSocketCreator,調用 // WebSocketCreator.register(Class<?> websocket)的方式告知WebSocketServletFactory factory.register(Socket.class); final WebSocketCreator creator = factory.getCreator(); // Set your custom Creator factory.setCreator( /*(servletUpgradeRequest ,servletUpgradeResponse) -> {socket Object webSocket = creator.createWebSocket(servletUpgradeRequest, servletUpgradeResponse); // Use the object created by the default creator and inject your members System.out.println("------------------------------------"); injector.injectMembers(webSocket); System.out.println("Injector works complete"); return webSocket; });*/ new WebSocketCreator() { @Override public Object createWebSocket(ServletUpgradeRequest servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse) { Object webSocket = creator.createWebSocket(servletUpgradeRequest, servletUpgradeResponse); // Use the object created by the default creator and inject your members System.out.println("------------------------------------"); injector.injectMembers(webSocket); System.out.println("Injector works complete"); return webSocket; } }); } };ide |
每個WebApp都對應相應一個context,那麼也就對應一個contextHandler,當servlet容器收到外部的http請求以後,會根據其請求的path信息來找到相應的webapplication來處理,也就是要找到對應的contextHandler來處理 ,這裏也就知道了contextHandler的最重要的做用,那就是指定不一樣WebApp的路徑,並將屬於當前web的http請求交由內部對應的servlet來處理。函數
ContextHandler context = new ContextHandler(); context.setContextPath("/event"); context.setHandler(wsHandler); server.setHandler(wsHandler); System.out.println("try to start and join");編碼 |
啓動該server,並join使線程啓動
join方法其實是調用了jetty中的線程池,並堵塞當前線程使得server可以優先於當前線程啓動,這樣保證了server必定可以啓動(若是沒有join,那麼在程序輕量級的狀況下也可以正常運行,這是得益於Jetty啓動速度很是快的緣由,當application比較繁雜的時候,必須使用join函數保證server可以優先啓動。)
try { server.start(); System.out.println("Try to join"); server.join(); System.out.println("joined"); } catch (Exception t) { System.out.println(t.getStackTrace()); t.printStackTrace(System.err); } |
到這裏爲止,全部的啓動設置已經完成,你也能夠直接構建Jetty Servlet,獲取並建立一個webSocket的Lister或是Adapter,並從Jetty線程池中建立新的線程執行該server去啓動它,這沒有一個固定的格式,取決於你的業務邏輯與編碼習慣。
3.websocket信息交互服務設置
WebSocketAdapter是一個比WebSocketListener更爲強大的適配器,它能夠提供完整有效的Session檢查。
public class Socket extends WebSocketAdapter { @Override public void onWebSocketClose(int statusCode, String reason) { super.onWebSocketClose(statusCode, reason); System.out.println("關閉socket"); } @Override public void onWebSocketConnect(Session sess) { super.onWebSocketConnect(sess); System.out.println("開啓socket鏈接"); } @Override public void onWebSocketError(Throwable cause) { super.onWebSocketError(cause); System.out.println("socket鏈接錯誤"); } @Override public void onWebSocketText(String message) { super.onWebSocketText(message); System.out.println("獲取信息爲:"+message); } } |
固然,Jetty也提供註解的方式實現這個設置,分別是:
@WebSocket 一個必須的類級別註釋,表示這個類做爲WebSocket;
@OnWebSocketClose 一個可選的方法級別註釋,對應關閉webSocket時執行;
@OnWebSocketConnect 一個可選的方法級別註釋,對應打開webSocket時執行;
@OnWebSocketMessage 一個可選的方法級別註釋,對應接收消息時執行;
@OnWebSockError 一個可選的方法級別註釋,對應webSocket出現error事件時執行。