在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事件时执行。

相关文章
相关标签/搜索