如何为Jetty WebSocket实例化WebSocketAdapter实例

如何为Jetty WebSocket实例化WebSocketAdapter实例,websocket,jetty,Websocket,Jetty,我按照示例创建了一个websocket服务器: Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(port); server.addConnector(connector); ServletContextHandler servletContextHandler = new ServletCont

我按照示例创建了一个websocket服务器:

    Server server = new Server();
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(port);
    server.addConnector(connector);

    ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", true, false);

    EventServlet es = injector.getInstance(EventServlet.class);
    servletContextHandler.addServlet(new ServletHolder(es), "/events/*");
EventServlet类如下所示:

    public class EventServlet extends WebSocketServlet {
        @Override
        public void configure(WebSocketServletFactory factory) {
            factory.getPolicy().setIdleTimeout(10000);
            factory.register(EventSocketCache.class);

        }
    }
public class EventSocketCache extends WebSocketAdapter {


private static int i = 0;
private static int counter = 0;

private static Map<Integer, Session> sessionMap = new HashMap<>();

private final Cache<String, String> testCache;

@Inject
public EventSocketCache(Cache<String, String> testCache) {
    this.testCache = testCache;
}

@Override
public void onWebSocketConnect(Session session) {
    super.onWebSocketConnect(session);
    System.out.println("Socket Connected: " + session);
    System.out.println("Connect: " + session.getRemoteAddress().getAddress());
    try {
        session.getRemote().sendString("Hello Webbrowser");
        session.setIdleTimeout(50000);        
    } catch (IOException e) {
        e.printStackTrace();
    }
}


@Override
public void onWebSocketText(String message) {
    super.onWebSocketText(message);
    System.out.println("Received TEXT message: " + message);
}


@Override
public void onWebSocketBinary(byte[] payload, int offset, int len) {
    byte[] newData = Arrays.copyOfRange(payload, offset, offset + len);

    try {
        Common.Success success = Common.Success.parseFrom(newData);
        System.err.println("------> " + success.getIsSuccess());
    } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
    }
}


@Override
public void onWebSocketClose(int statusCode, String reason) {
    System.err.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
    // Remove from the list here....
    super.onWebSocketClose(statusCode, reason);
    System.out.println("Socket Closed: [" + statusCode + "] " + reason);
}


@Override
public void onWebSocketError(Throwable cause) {
    System.err.println("######################################");
    super.onWebSocketError(cause);
    cause.printStackTrace(System.err);
}
EventSocketCache看起来像:

    public class EventServlet extends WebSocketServlet {
        @Override
        public void configure(WebSocketServletFactory factory) {
            factory.getPolicy().setIdleTimeout(10000);
            factory.register(EventSocketCache.class);

        }
    }
public class EventSocketCache extends WebSocketAdapter {


private static int i = 0;
private static int counter = 0;

private static Map<Integer, Session> sessionMap = new HashMap<>();

private final Cache<String, String> testCache;

@Inject
public EventSocketCache(Cache<String, String> testCache) {
    this.testCache = testCache;
}

@Override
public void onWebSocketConnect(Session session) {
    super.onWebSocketConnect(session);
    System.out.println("Socket Connected: " + session);
    System.out.println("Connect: " + session.getRemoteAddress().getAddress());
    try {
        session.getRemote().sendString("Hello Webbrowser");
        session.setIdleTimeout(50000);        
    } catch (IOException e) {
        e.printStackTrace();
    }
}


@Override
public void onWebSocketText(String message) {
    super.onWebSocketText(message);
    System.out.println("Received TEXT message: " + message);
}


@Override
public void onWebSocketBinary(byte[] payload, int offset, int len) {
    byte[] newData = Arrays.copyOfRange(payload, offset, offset + len);

    try {
        Common.Success success = Common.Success.parseFrom(newData);
        System.err.println("------> " + success.getIsSuccess());
    } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
    }
}


@Override
public void onWebSocketClose(int statusCode, String reason) {
    System.err.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
    // Remove from the list here....
    super.onWebSocketClose(statusCode, reason);
    System.out.println("Socket Closed: [" + statusCode + "] " + reason);
}


@Override
public void onWebSocketError(Throwable cause) {
    System.err.println("######################################");
    super.onWebSocketError(cause);
    cause.printStackTrace(System.err);
}
似乎在创建EventSocketCache实例时出现问题;如果没有构造函数,一切正常。
我想知道如何正确地实例化EventSocketCache并将其注册到EventServlet以使事情正常进行?

我想我已经找到了解决您问题的方法。您必须在WebSocketServlet中使用WebSocketCreator:

public类MenuServlet扩展了WebSocketServlet{
@注入
专用注射器;
@凌驾
公共void配置(WebSocketServletFactory WebSocketServletFactory){
//注册你的账户
寄存器(MenuSocket.class);
//获取当前创建者(用于重用)
最终WebSocketCreator=webSocketServletFactory.getCreator();
//设置自定义创建者
setCreator(新的WebSocketCreator(){
@凌驾
公共对象createWebSocket(ServletUpgradeRequest ServletUpgradeRequest,ServletUpgradeResponse ServletUpgradeResponse){
对象webSocket=creator.createWebSocket(servletUpgradeRequest,servletUpgradeResponse);
//使用默认创建者创建的对象并注入成员
注入器。注入器构件(webSocket);
返回网袋;
}
});
}
}

在那里,您可以将您的成员注入WebSocketAdapter。这对我来说确实有效

当我注册的类需要对象时,这对我很有帮助。这是将我的对象强制转换到实际类并调用相关方法来设置一些对象的唯一方法,谢谢!@Inject和Injector类来自哪里?