我有一个使用Ratchet / PHP的Websocket服务器:
<?php
require __DIR__.'/../vendor/autoload.php';
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Mediator;
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Mediator()
)
),
9000
);
$server->run();
?>
调解器类:
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Mediator implements MessageComponentInterface {
protected $clients = [];
public function onOpen(ConnectionInterface $conn) {
$this->clients[$conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
echo "Incoming: $msg\n";
}
public function onClose(ConnectionInterface $conn) {
unset($this->clients[$conn->resourceId]);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
?>
现在在客户端,我有这个基本的JS代码:
let ws = new WebSocket('wss://localhost:8443');
ws.addEventListener('open', () => {
ws.send('Hello!');
});
ws.addEventListener('message', event => {
alert(event.data);
});
它确实可以工作(我可以发送和接收消息),但这是问题所在:
首次访问该页面时,与websocket服务器的连接已建立并且可以正常工作。当我关闭页面时,连接将关闭(应如此)。但是,当我刷新页面时,连接已关闭(在卸载页面时,这是正常的),但是当再次加载页面时,未与websocket服务器建立连接。我必须再次刷新 才能使脚本连接。这不应该发生,对吧?我不知道为什么会这样,是什么原因造成的。
答案 0 :(得分:0)
也许添加事件监听器以关闭您的ws
javascript WebSocket
,然后再尝试重新打开它。
let ws = new WebSocket('wss://localhost:8443');
ws.addEventListener('open', () => {
ws.send('Hello!');
});
$(window).unload(function () {
ws.close();
});
还包括可能的控制台错误,因为这似乎与您的JavaScript WebSocket
逻辑有关,但是我一直在阅读more info about Rachet/PHP,并且希望您了解有关后端逻辑的其他信息。
我建议您to check out their demo page并调试代码和网络请求。开始重新创建1-1完全相同的工作功能,然后实施更改并了解导致错误的原因:
1)查看您的网络请求并保留日志,阅读并报告所有奇怪的问题
2)查看他们的演示代码