在Jetty中使用websocket

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事件時執行。

相關文章
相關標籤/搜索