java - 连接升级至WebSocket

标签 java rest web-services

我的设备记录很少,应该以 RESTfulWebsocket 两种方式进行通信。我只对可通过 Websocket 访问的功能感兴趣。我已经打开套接字并期待一些 Json 数据包,但收到消息:

GET /api/v1/tasks HTTP/1.1
Upgrade: websocket
Sec-WebSocket-Key: MjhkYjNVdk93M0Fnd3lwdw==
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Host: 192.168.0.80:3701
Sec-WebSocket-Version: 13
User-Agent: DVR Server
Accept-Language: en-us,en;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: Upgrade

我认为这是 RESTful 调用,并且此消息试图提供升级到 WebSocket 的服务。我是对的?但如何接受这个呢?我应该发送什么作为答案?在 Java 中执行此操作的最佳方法是什么?

最佳答案

如果您只想接受 websocket 握手,则以下代码即可完成工作。
acceptHandshake 函数的第一个参数是写入套接字的 OutputStream 的 writer。

private void acceptHandshake(PrintWriter output, String secureWebSocketKey) {
    try {
        output.println("HTTP/1.1 101 Switching Protocols");
        output.println("Upgrade: websocket");
        output.println("Connection: Upgrade");
        output.println("Sec-WebSocket-Accept: " + encode(key));
        output.println();
        output.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String encode(String key) throws Exception {
    key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    byte[] bytes = MessageDigest.getInstance("SHA-1").digest(key.getBytes());
    return DatatypeConverter.printBase64Binary(bytes);
}

关于java - 连接升级至WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374304/

相关文章:

java - 用于简单状态转换的状态机方法

http - 有什么理由不在 Web 应用程序中使用 HTTP PUT 和 DELETE 吗?

java - Spring RESTful 应用程序中的 HTTP POST 请求

java - 我们可以对不同包名称中的所有 webServies 使用相同的 @HandlerChain 吗?

java - 使用 Web 服务时未找到 LocalTransportSender

java - 在 Java 中,如何将包含数组的字符串转换为实际的数组

Java 属性文件验证

java - HBase:使用MapReduce更新行?

java - 对 Java POST 调用的 HTTP 错误请求响应

python - 使用 Python 调用 REST 服务