jetty websocket server:根据应用逻辑发送客户状态码

jetty websocket server: Send customer status code based on application logic

我正在使用 Jetty 编写 Websocket 服务器。

我的处理程序代码:

public class WebSocketServerHandler {

    @OnWebSocketClose
    public void onClose(int statusCode, String reason) {
        System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason);

    }

    @OnWebSocketError
    public void onError(Throwable t) {
    }

    @OnWebSocketConnect
    public void onConnect(Session session) {

    }

    @OnWebSocketMessage
    public void onMessage(Session session, String message) {
    }

    @OnWebSocketMessage
    public void onBinaryMethod(Session session, byte data[], int offset, int length) {

    }
}

我的一个要求是发送基于业务逻辑的自定义状态代码 onBinaryMethod
例如:发送 1001 作为超时状态码(Jetty 已经支持)

我不知道在哪里设置这些状态代码。我试过跟随,但似乎没有用。

Session().getUpgradeResponse().setStatusCode();

WebSockets

这里是关于WebSocket状态码的RFC

在与 socket 通信期间,您不应该在状态代码中发送此类信息。发送 message 而不是客户需要的信息。

如果您碰巧对关闭代码感兴趣,您可以在 Session 对象上提供此信息,如下所示:

session.close(new CloseReason(YOUR_NUMBER, "Your reason")); 

REST

如果您依赖这些代码使用 REST 服务,那里有很多选项:

  • 引发特定异常
  • 使用响应生成器和return响应
  • 注入上下文

我认为实现您的目标的最简单方法是使用 setStatus(int):

@Context 
HttpServletResponse response;

@Path("/method")
public void onBinaryMethod() {
    int statusCode = 200;
    //SOME CODE
    response.setStatus(statusCode);
}

这是一个很好的答案,列出了很多可能的解决方案: