Websocket не подключается при обновлении - PullRequest
5 голосов
/ 26 апреля 2019

У меня есть сервер Websocket с использованием Ratchet / PHP:

<?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);
});

Это работает (я могу отправлять и получать сообщения), однако вот проблема:

При первом посещении страницы соединение с сервером веб-сокетов устанавливается и работает нормально. Когда я закрываю страницу, соединение закрывается (как и должно быть). Однако, когда я обновляю страницу, соединение закрывается (при выгрузке страницы это нормально), но когда страница загружается снова, соединение с сервером веб-сокетов не устанавливается. Мне нужно обновить снова , чтобы скрипт подключился. Этого не должно быть, верно? Я понятия не имею, почему это происходит, что вызывает это.

1 Ответ

0 голосов
/ 07 мая 2019

возможно, добавьте прослушиватель событий, чтобы закрыть ваш ws javascript WebSocket, прежде чем пытаться открыть его снова.

let ws = new WebSocket('wss://localhost:8443');
ws.addEventListener('open', () => {
    ws.send('Hello!');
});


$(window).unload(function () {
   ws.close();
});

также включает возможные ошибки консоли, поскольку это похоже на проблему с вашей логикой javascript WebSocket, но я читал дополнительную информацию о Rachet / PHP , и я был бы признателендополнительная информация о вашей бэкэнд-логике.

Обновление

Я предлагаю вам проверить их демонстрационную страницу и отладить как ваш код, так и ваши сетевые запросы.Начните заново создавать абсолютно идентичные рабочие функции 1-1, затем внесите изменения и поймите, что вызывает ваши ошибки:

1) Просмотрите ваш сетевой запрос и сохраните журнал, прочитайте их и сообщите о любых странных проблемах

enter image description here

2) Просмотрите их код для демонстрации

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...