java - 连接升级到 WebSocket
问题描述
我有记录不良的设备,应该以两种方式进行通信,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 握手,下面的代码就可以了。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);
}
推荐阅读
- dialogflow-es - 如何在 Google Home 智能显示屏上更改卡片标题的位置
- bash - 如何增加文本中的数字
- firebase - 如何将一组数据类型放入 Firestore?
- sql - 获取多边形的子/父关系
- excel - 对多个复制粘贴功能的编码建议:为每个或全部创建一个新模块到一个代码中?
- javascript - 从画布下载时不支持图像文件格式
- python-3.x - 使用 Pandas 计算标准差时出错
- javascript - JS:如何防止竞争条件?
- powerbi - 如何使用 DAX Power BI 按百分比计算每个变量的值
- android - 为什么我的 Admob 横幅在重新加载时会闪烁到顶部?