我第一次使用websockets并且不确定我做错了什么。由于我的IP是动态的,我使用以下websocket调用服务器端:
$echo = new echoServer("myurl.com","9000");
以及以下呼叫客户端:
socket = new WebSocket("wss://myurl.com:9000");
即使服务器完全未被占用,我也会出现超时错误。有谁知道为什么?我觉得这是一个基本错误
答案 0 :(得分:0)
该特定服务器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上的这种弱类型,特别是像我这样的开发人员做出的假设,是造成许多安全漏洞的原因。)