WebSocket не может установить соединение с сервером

Я пытаюсь создать простую страницу чата в моем проекте Symfony с помощью WebSocket. Сначала я использовал библиотеку React-php, она отлично работает на терминале, но когда я пытаюсь подключить ее к браузеру, я столкнулся с этой ошибкой на хроме:

Uncaught Error: INVALID_STATE_ERR: DOM Exception 11

и в фаерфоксе

Firefox can't establish a connection to the server at ws://localhost:8000/.

Затем я использовал библиотеку Ratchet и следовал инструкциям, но все та же проблема, работа на терминале, ошибка в браузере. Я использую telnet localhost 8000 на терминале, а javascript в браузере

var conn = new WebSocket('ws://localhost:8000');
conn.onmessage = function(e) {
    console.log(e.data);
};
conn.send('Hello World!');

серверный код для React

require __DIR__.'/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$conns = new \SplObjectStorage();
$socket->on('connection', function ($conn) use ($conns) {
    $conns->attach($conn);
    $conn->on('data', function ($data) use ($conns, $conn) {
        foreach ($conns as $current) {
            if ($conn === $current) {
                continue;
            }
            $current->write($data);
        }
    });
    $conn->on('end', function () use ($conns, $conn) {
        $conns->detach($conn);
    });
});
$socket->listen(8000);
$loop->run();

и серверный код для Ratchet

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/chat.php';
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
$server = IoServer::factory( new WsServer( new Chat() ), 8000);
$server->run();

Другое дело, что URL-адрес клиентской страницы localhost/X/chat, а сервер localhost/X/server, я пробовал ws://localhost:8000/X/server, но все равно не работает.


person Erfan    schedule 27.10.2012    source источник


Ответы (3)


Вы не можете позвонить send, пока соединение не будет установлено. Вам нужно выполнить привязку к событию onopen:

var conn = new WebSocket('ws://localhost:8000');
conn.onmessage = function(e) {
    console.log(e.data);
};
conn.onopen = function () {
    conn.send('Hello World!');
};

Это должно решить вашу проблему.

person igorw    schedule 28.10.2012
comment
Если соединение правильное, conn.send() можно использовать. Однако я попробовал ваш код, но все еще не работает. - person Erfan; 31.10.2012
comment
Что вы имеете в виду под не работает? Вы получаете новую ошибку? Если да, то я ответил на ваш вопрос. - person igorw; 31.10.2012

Проблема была в cURL ext. решено.

person Erfan    schedule 05.11.2012
comment
как ты это решил? что именно вы сделали, чтобы заставить его работать? - person Adrian Covaci; 24.04.2020
comment
после 7 лет я понятия не имею, что я сделал :) основываясь на комментарии, может быть, я установил расширение curl для php - person Erfan; 24.04.2020
comment
Я вообразил, что вы не помните, но я все равно сказал попробовать. Я в отчаянии, что мой веб-сокет не подключается, и это не проблема cURL, насколько я заметил. - person Adrian Covaci; 24.04.2020

Насколько я понимаю, React\Socket открывает незашифрованное TCP/IP-соединение.

Вы можете использовать любой клиент TCP/IP с открытым текстом для подключения к вашему серверу, например, telnet или любую другую библиотеку TCP/IP.

Если вы хотите использовать клиент WebSocket, например, предоставляемый вашим браузером, вам придется использовать сервер WebSocket. Ratchet — это сервер WebSocket, созданный на основе этого проекта.

Посмотрите это https://github.com/reactphp/socket/issues/142

person Danilo Correa    schedule 20.05.2020