我正在尝试使用 Workerman 库创建自己的 websocket 并将我的前端部分与服务器连接。我正在使用 Apache2 来运行它。
那么,让我们看看它是什么样子的:
$worker = new Worker('websocket://127.0.0.1:80');
$worker->onMessage = function($connection, $data) use($worker) {
foreach($worker->connections as $clientConnection) {
$clientConnection->send('Hello World');
}
};
Worker::runAll();
let socket = new WebSocket('wss://localhost:80');
没什么特别的,只是应该这样做。至少在我看来。
我打开地址页面没有问题:
https://localhost/websocket/test.html
但是,我在浏览器 JS 控制台上收到错误:
WebSocket connection to 'wss://localhost:80/' failed
好吧,ofc,我尝试了人们在类似主题下推荐的许多不同方法来修复它。
我尝试打开地址为“127.0.0.1”而不是“localhost”的页面。一样的东西。我尝试在 JS 代码中将连接地址中的 'localhost' 更改为 '127.0.0.1' - 仍然没有任何变化。
我的自签名 SSL 证书工作正常,尽管浏览器告诉我连接不安全。至少我可以忽略它并打开页面。尽管如此,页面仍无法连接到 websocket。
我的浏览器是 Google Chrome。我也尝试了 Firefox 中的东西,仍然得到我得到的结果。
UPD:我将端口更改为443。出于某种原因,当我使用时
let socket = new WebSocket('wss://127.0.0.1:443');
我在浏览器控制台中收到以下错误:
WebSocket connection to 'wss://127.0.0.1/' failed
就像它不再看到端口号一样,因为我不确定它是否应该看到。
好吧,问题确实出在端口号上,我不明白我应该使用哪个端口号,而那个不应该被使用的端口号,例如 3000。
另外,如果你想使用 ssl,Workerman 希望你配置与套接字的连接方式,所以我需要将其添加到我的 server.php 文件中:
$context = array(
'ssl' => array(
'local_cert' => './cert/myCA.pem',
'local_pk' => './cert/myCA.key',
'verify_peer' => false,
)
);
$worker = new Worker('websocket://127.0.0.1:3000', $context);
$worker->transport = 'ssl';