我有记录不佳的设备,应该以两种方式进行通信RESTful
和Websocket
。我只对可通过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 握手,则以下代码将完成这项工作。
accept握手函数的第一个参数是写入套接字的输出流的编写器。
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);
}