FAQ(88): The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket?

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()));

教训:

对于代码的审核要严谨,专一去思考逻辑,不然就会给本身带来额外的工做量。

 

参考:

https://github.com/eclipse/jetty.project/issues/3903

相关文章
相关标签/搜索