2019年9月10日java
这天部署服务器后,发现websocket 出现链接异常,这里摘取部分重要log。python
log:
java.util.concurrent.ExecutionException: javax.websocket.DeploymentException: The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket Caused by: javax.websocket.DeploymentException: The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket
原理:
客户端与服务器端创建长链接以前,须要先经过HTTP创建链接,而后才将协议升级为websocket(本质上仍是TCP协议)。git
定位手段:
- 写个python脚本测试长链接
import websocket url = 'wss://host:port/' #websocket链接地址 ws = websocket.create_connection(url) data = 'ping' ws.send(data) print(ws.recv()) #服务器响应数据 ws.close() #关闭链接
上面是一段python脚本,可是我后来发现单元环境不少py依赖的包都没有安装,从新去搭环境又费事费劲,因此决定另谋他路了。github
- cURL指令检测
curl -i http://localhost:9090/interserver
curl是一个命令行工具,经过指定的URL来上传或下载数据,并将数据展现出来。这里我利用工具模拟了我这边的长链接创建url,去测试个人服务器长链接是否正常。web
结论是:websocket能够正常建立链接的。bash
- 端口检测是否正常
最后检查端口是否是异常了,指令(由于这边开启的端口是9090):服务器
netstat -aln |grep 9090
结论是:端口木有问题websocket
- 检查代码是否出错
长链接创建的代码,瞄一眼看看:eclipse
URI uri = new URI(String.format("ws://%s:%d/", border.getPrivateAddress(), border.getPrivatePort()));
结论是:果真代码有改动,致使链接建立失败!!curl
应该修改成:
URI uri = new URI(String.format("ws://%s:%d/interserver", border.getPrivateAddress(), border.getPrivatePort()));
教训:
对于代码的审核要严谨,专一去思考逻辑,不然就会给本身带来额外的工做量。
参考: