【问题标题】:jetty websocket server: Send customer status code based on application logicjetty websocket server:根据应用逻辑发送客户状态码
【发布时间】:2017-12-05 00:07:10
【问题描述】:

我正在使用 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) {

    }
}

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

我不确定在哪里设置这些状态代码。我已经尝试过,但似乎不起作用。

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

【问题讨论】:

  • 您询问的是哪个状态码?您似乎混淆了 HTTP 响应状态代码(3 位)和 WebSocket 关闭状态代码(4 位)。

标签: java websocket server jetty


【解决方案1】:

WebSockets

这里是RFC关于WebSocket的状态码。

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

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

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

REST

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

  • 抛出特定异常
  • 使用响应生成器并返回响应
  • 注入上下文

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

@Context 
HttpServletResponse response;

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

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

https://stackoverflow.com/a/22869076/4823977

【讨论】:

  • 我认为 OP 询问的是 WebSocket 关闭状态代码,而不是 HTTP 状态代码。
  • 我更新了答案,如果是这样的话,我很好奇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2016-05-13
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多