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

部署运行你感兴趣的模型镜像

2019年9月10日

这天部署服务器后,发现websocket 出现连接异常,这里摘取部分重要log。

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协议)。

 

定位手段:

  • 写个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依赖的包都没有安装,重新去搭环境又费事费劲,所以决定另谋他路了。

  • cURL指令检测
curl -i http://localhost:9090/interserver

curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。这里我利用工具模拟了我这边的长连接建立url,去测试我的服务器长连接是否正常。

结论是:websocket可以正常创建连接的。

 

 

  • 端口检测是否正常

最后检查端口是不是异常了,指令(因为这边开启的端口是9090):

 netstat -aln |grep 9090

结论是:端口木有问题

 

  • 检查代码是否出错

长连接建立的代码,瞄一眼看看:

  URI uri = new URI(String.format("ws://%s:%d/", border.getPrivateAddress(), border.getPrivatePort()));

结论是:果然代码有改动,导致连接创建失败!!

应该修改为:

  URI uri = new URI(String.format("ws://%s:%d/interserver", border.getPrivateAddress(), border.getPrivatePort()));
            

教训:

对于代码的审核要严谨,专注去思考逻辑,否则就会给自己带来额外的工作量。

 

参考:

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

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值