我是第一次使用websockets,不确定我做错了什么。 由于我的IP是动态的,我使用以下websocket调用服务器端:
$echo = new echoServer("myurl.com","9000");
以及以下调用客户端:
socket = new WebSocket("wss://myurl.com:9000");
即使服务器完全未被占用,我也会收到超时错误。 有谁知道为什么?我觉得这是一个基本错误
特定服务器PHP-Websockets不支持wss://
协议(安全连接,类似于HTTP流量的https://
)。
将连接线更改为:
socket = new WebSocket("ws://myurl.com:9000");
或者,如果您需要TLS支持,PHP-Websockets可能不是最适合您的服务器。
我决定在 PHP-Websockets 中不支持 TLS,因为我不知道有任何经过稳健测试、战斗强化的 PHP 软件包提供对 OpenSSL 库的访问。 我已经在 5 分钟前改变了主意,并将使用内置的 PHP OpenSSL 函数实现 TLS,但这需要时间来实现,并且需要几个测试人员。 如果您不想等待,请不要等待。
我不希望人们认为他们的数据是安全的,而我根本无法保证。
此外,不是专门导致故障,但仍然是一个问题:在服务器端代码中,应将实例化服务器的对象更改为:
$echo = new echoServer("0.0.0.0", "9000");
原因是 IP 地址正在设置服务器的侦听地址。 侦听地址"0.0.0.0"被转换为"侦听此机器可以侦听的所有 IP 地址"。 这意味着,除了您自己的公共 IP 之外,它还将侦听 127.0.0.1,如果您有第二个分配了不同 IP 地址的网卡,您也可以从中接收流量。
但是,由于 PHP 的弱类型,当 socket_bind()
尝试将 IP 地址转换为其二进制表示形式,但找到一个字符串时,它会静默地将其转换为 0,相当于 IP 地址 0.0.0.0。
(我以前认为socket_bind()
正在执行DNS查找以获取IP地址。 我大错特错了。 PHP的这种弱类型,尤其是像我这样的开发人员所做的假设,是许多安全漏洞的原因。