Websocket无法在刷新时连接

时间:2019-04-26 14:58:55

标签: javascript php websocket

我有一个使用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服务器建立连接。我必须再次刷新 才能使脚本连接。这不应该发生,对吧?我不知道为什么会这样,是什么原因造成的。

1 个答案:

答案 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)查看您的网络请求并保留日志,阅读并报告所有奇怪的问题

enter image description here

2)查看他们的演示代码

enter image description here