问题场景:
Websocket就是在web端上的全双工通信,一旦链接成功就是持久性的链接,不需要像Http那样请求一次那一次信息,浪费资源。
本次场景是在我用websocket配合echart在web端画出底层机器采集到数据实时显示到web端,本来在本地以及配置好,也能完美运行了,但是上传到服务器后就出现问题了。
websocket = new WebSocket("ws://127.0.0.1:8080/xxx");
websocket.onerror = function(e){/* console.info("onerror=>", e) */console.log(e);}
通过onerror catch到readyState=3
通过查询到webSocket的readyState属性用来定义连接状态,该属性的值有下面几种:
0 :对应常量CONNECTING (numeric value 0),
正在建立连接连接,还没有完成。The connection has not yet been established.
1 :对应常量OPEN (numeric value 1),
连接成功建立,可以进行通信。The WebSocket connection is established and communication is possible.
2 :对应常量CLOSING (numeric value 2)
连接正在进行关闭握手,即将关闭。The connection is going through the closing handshake.
3 : 对应常量CLOSED (numeric value 3)
连接已经关闭或者根本没有建立。The connection has been closed or could not be opened.
那很明显我用上了SSL的Https的网址连接wss根本就没有建立。
这就是我找到的问题
问题分析:
然后因为云服务器的Apache的Https的端口默认是443的,如果又想运Apache又想运行一个Https的网站,明显不能同时用443端口,所以只能通过Apache的反向代理,把jar包的比如8080端口的反向代理到443端口,就能实现网站和Apache同时在机器上运行了。
那么因为我是通过 Apache 代理,将域名解析到指定端口来实现 Springboot 应用的上线,而 WebSocket 在握手的时候请求直接发送到 Apache。Apache 代理的时候没法将 WebSocket 握手请求传递给 Springboot 应用,结果就是握手失败,就是根本找不到连接了!
问题解决方法:
1, 进入宝塔面板, 网站 -> 设置, *注: 网站绑定的域名必须是先支持https的
2, 查看反向代理的具体配置文件地址
3, 目录下只有一个文件, 将持久化连接配置, 按如下图加这两行代码。即可开启WSS
ProxyPass /wss ws://www.xxx.com:port/ProxyPassReverse /wss ws://www.xxx.com:port/
最后!!!
如果你也是Apache反向代理后的,请在js那这样配置websocket的对象
websocket = new WebSocket("wss://网址:反向代理后的端口(比如8080,因为反向代理了,不可能是443的,注意这个,一定要加上反向代理后的端口)/xxx/xxxxxx");