浏览器使用
new WebSocket("wss://xxx.com:8282");
证书是阿里云免费申请的,绑定了域名,服务也启动了,端口也正确!
/_ 证书地址 _/
$context = array(
'ssl' => array(
'local_cert' => 'cert/server.pem',
'local_pk' => 'cert/private.key',
'verify_peer' => false
)
);
$gateway = new Gateway("websocket://0.0.0.0:8282" , $context);
$gateway->transport = 'ssl';
客户端错误
WebSocket connection to 'wss://xxx.com:8282/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
证书如下
客户端连接失败原因
连接失败客户端一般会有两种报错,connection refuse 和 connection timeout
connection refuse(连接拒绝)
一般是以下原因:
1、客户端连接的端口错了
2、客户端连接的域名或者ip错了
3、如果客户端使用了域名连接,域名可能指向了错误的服务器ip
4、服务器使用了cdn等加速代理,导致连接的实际ip与预期ip不一致
5、服务端没有启动或者端口没有被监听
6、使用了网络代理软件
7、服务端监听ip与访问地址不在一个地址段。例如服务端监听127.0.0.1,则客户端只能通过127.0.0.1连接,不能通过局域网ip或者外网ip连接。建议监听地址设置为0.0.0.0,这样本机、内网、外网都可以连接。
connection timeout(连接超时)
一般是以下原因:
1、服务器防火墙阻止了连接,可以临时关闭防火墙试下
2、如果是云服务器,安全组也可能会阻止连接建立,需要到管理后台开放对应端口
3、如果用了宝塔等面板,需要在宝塔中开放对应端口
4、服务器不存在或者没有启动
5、如果客户端使用了域名连接,域名可能指向了错误的服务器ip
6、客户端访问的ip是服务器内网ip,并且客户端和服务端不在一个局域网
其它报错
如果发生的报错不是connection refuse 和 connection timeout则一般是以下原因:
1、客户端使用的通讯协议与服务端不一致。
例如服务端是http通讯协议,客户端使用websocket通讯协议访问是无法连接的。如果客户端用websocket协议连接,那么服务端必须也是websocket协议。如果服务端是http协议的服务,那么客户端必须用http协议访问。
这里的原理类似如果你要和英国人交流,那么要使用英语。如果要和日本人交流,那么要使用日语。这里的语言就类似通讯协议,双方(客户端和服务端)必须使用相同的语言才能交流,否则无法通讯。
通讯协议不一致导致的常见的报错有:
WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: Unexpected response code: xxx
WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE
解决办法:
从上面两条报错看出,客户端使用的是ws连接是websocket协议。服务端也需要是websocket协议才行,服务端监听部分代码需要指定websocket协议才能通讯,例如下面这样
如果是gatewayWorker,监听部分代码类似
// websocket协议,这样客户端才能用ws://...来连。xxxx为端口不用改动
$gateway = new Gateway('websocket://0.0.0.0:xxxx');
如果是Workerman则是
// websocket协议,这样客户端才能用ws://...来连。xxxx为端口不用改动
$worker = new Worker('websocket://0.0.0.0:xxxx');
以上摘自手册 https://www.workerman.net/doc/workerman/faq/client-connect-fail.html
CONNECTION_REFUSED,要么连错服务器了,要么端口错了。
估计你的域名对应的服务器ip不是你运行GatewayWorker的服务器。例如用了cdn加速等会出现这种情况。
是一个服务器,使用ws可以连接,wss就不行,有没有可能是证书使用错了?
不是证书问题。如果服务器是对的,那看下防火墙和安全组吧。或者也可能服务根本没启动。
上次链接失败后服务是关闭了,忘记了错误信息是捂手超时?这个会是什么?防火墙关闭了,安全组开放了443
WebSocket connection to 'wss://xxx.com:8282/' failed: WebSocket opening handshake timed out
连的是8282就开放8282,开433没用
还是链接超时。。。。
改成ws,就可以链接。。。。
如果不会设置,可以按照workerman手册 用nginx代理ssl
你好 请问这个问题解决了么?我遇到同样的问题 求指导
我也遇到了这个问题了...
防火墙关了,安全组加了,本地的ws是成功的,http://doc4.workerman.net/326160 按照这个文章创建wss,
WebSocket connection to 'wss://127.0.0.1:8282/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
看到你发的手册连接里注意事项说不能用ip连,要用域名
@1469:昨天可能是太晚了脑子不好使了,没注意,但是今天早上我换成域名了还是有问题 。这不是意思已经返回200了吗 WebSocket connection to 'wss://www.blsa.cn/' failed: Error during WebSocket handshake: Unexpected response code: 200
估计端口错了吧。你不是连8282么,怎么又443了
@1469:我按照手册改了好几次都没有成功,后来改成了nginx代理了
亲测成功 (参考文档:http://doc4.workerman.net/326160):
服务端:
可能出错原因:1.证书不匹配(我用的是tx云的免费一年ssl证书,eg:有用到宝塔快速搭建网站,宝塔也必须放行端口)
启动websocket服务:
可能出错原因:1.openssl未开启;2.如果用到redis等服务,需提前开启
客户端:
可能出错原因:1.防火墙未关闭;2.端口未开;3:必须域名访问
反正都是大家说过的那几点,多检查一下,不成功肯定有什么地方忽略了。