Jetty Websocket

1.序言

  在工作中,我们有时候需要使用能与前端长时间实时通信传输以通信,这时就出现了的websocket。

2.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);

  接下来,创建一个可用的webSocket对象

// 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) -> {
                    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;
        }
    });
}};

  每一个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事件时执行

你可能感兴趣的:(Jetty Websocket)