PHP Ratchet не может подключиться с другого устройства

Я начинаю использовать сокет PhP Ratchet. Следуя инструкциям, я смог создать простое приложение для чата, и оно работает на том же компьютере. Например, если я открываю Chrome и Firefox, я могу взаимодействовать, отправлять и получать сообщения, хорошо.

Проблема возникает, когда я пытаюсь использовать приложение чата с другого компьютера, но в том же интернет-соединении, или даже когда я пытаюсь протестировать его в Интернете.

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

Оглядевшись, я обнаружил, что можно использовать «0.0.0.0» или даже порт 5555, чтобы разрешить подключения от кого угодно. Но даже при использовании этого я не могу подключиться.

Как я могу это решить? Это мои файлы:

сервер.php

<?php

    use Ratchet\Server\IoServer;
    use Ratchet\http\HttpServer;
    use Ratchet\WebSocket\WsServer;

    require __DIR__ . '/../vendor/autoload.php';

    $server = IoServer::factory(
        new HttpServer(
            new WsServer(
                new Chat()
            )
        ), 2000, '0.0.0.0'
    );

    $server->run();

?>

И клиентский js-файл:

var socket = new WebSocket('ws://127.0.0.1:2000');

person celsomtrindade    schedule 02.03.2016    source источник
comment
В клиенте вы пытались использовать адрес сервера вместо 127.0.0.1, что-то вроде 192.xxx.xxx.xxx   -  person codisfy    schedule 02.03.2016
comment
@codeHeart на локальном хосте работало, но как заставить его работать онлайн?   -  person celsomtrindade    schedule 02.03.2016
comment
Кто-нибудь поможет мне в этом, та же проблема сохраняется и у меня, нажмите здесь   -  person Nɪsʜᴀɴᴛʜ ॐ    schedule 20.10.2018


Ответы (1)


127.0.0.1 будет всегда указывать на локальное устройство, которое на устройствах, отличных от сервера сокетов, не будет указывать на устройство, на котором размещен сервер сокетов. Если устройство, на котором работает сервер сокетов, не маршрутизируется из Интернета, вы не сможете подключиться к сокету из Интернета.

Вы можете проверить с других устройств в вашей локальной сети, выяснив, какой у вас сетевой IP-адрес для устройства, на котором работает сервер. Затем в клиентском коде подключитесь к этому IP-адресу. Вероятно, это будет что-то близкое к 192.168.x.x, например. 192.168.1.12 (также может быть в адресных пространствах 10.x.x.x или 172.16.x.x). Затем просто используйте этот адрес для подключения из клиентского скрипта для тестирования:

var socket = new WebSocket('ws://192.168.1.12:2000');

Вы все еще можете столкнуться с проблемами, если по какой-либо причине ваша сеть настроена на отбрасывание пакетов через порт 2000. Если это так, вам должно быть довольно легко перейти на другой порт как для вашего сервера, так и для клиента.

person Jeff Lambert    schedule 02.03.2016
comment
На локальном хосте я могу проверить сейчас. Но я все еще с проблемами при использовании его в Интернете. Я получаю эту ошибку: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state. при попытке отправить. Или если я подожду, он не подключается и также возвращает ошибку failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT - person celsomtrindade; 02.03.2016
comment
что вы подразумеваете под словом "онлайн"? вы развернули это на веб-сайте, расположенном на каком-то сервере не в вашей сети? мой ответ выше будет работать только с устройств, которые находятся в той же сети, что и сервер сокетов - person Jeff Lambert; 02.03.2016
comment
Да, я пытался проверить это онлайн, на веб-сайте. Локальный хост работал нормально, затем я попробовал его на своем веб-сайте и получил эти ошибки. Пс.: Использование 127.0.0.1 - person celsomtrindade; 02.03.2016
comment
помните, что у любого сокета есть две разные стороны — в данном случае это клиент и сервер. чтобы подключиться к серверу, клиент должен иметь возможность найти к нему маршрут. если клиент находится на каком-то сайте, он вообще не сможет маршрутизироваться к вашему чат-серверу в вашей локальной сети (по крайней мере, вы очень-очень на это надеетесь). оба должны быть доступны в Интернете. - person Jeff Lambert; 02.03.2016
comment
Но тогда как я могу заставить его работать и с онлайн-сервером? Ты знаешь как? - person celsomtrindade; 02.03.2016
comment
Да, вы должны развернуть сервер чата в сети и получить либо IP-адрес, либо имя, на которое вы можете указать свое клиентское приложение, например. new WebSocket('ws://my.chatserver.com:2000') или что-то еще. Вы также можете разместить их на том же домене. - person Jeff Lambert; 02.03.2016
comment
Что вы имеете в виду под чат-сервером? На локальном хосте мне нужно запустить php bin/server.php, нужно ли мне делать это онлайн? Я ничего не нашел об этом, и пример, который я использовал для создания, был очень простым. Помимо функции отправки/получения сообщения из сокета, код вопроса — это все, что у меня есть. - person celsomtrindade; 02.03.2016
comment
Давайте продолжим обсуждение в чате. - person Jeff Lambert; 02.03.2016
comment
Кто-нибудь поможет мне в этом, та же проблема сохраняется и у меня, нажмите здесь @JeffLambert - person Nɪsʜᴀɴᴛʜ ॐ; 20.10.2018