Проблема при подключении WebSocket (socketo.me) к размещенному серверу - PullRequest
0 голосов
/ 07 октября 2018

Когда я попытался запустить приложение чата с локального хоста, подключенного к базе данных MySQL, которая была закодирована с помощью PHP через WebSocket, она прошла успешно.

Кроме того, когда я пытался запустить с терминала PuTTY, вошедшего в учетные данные SSH, он отображался как Сервер запущен с портом # 8383

somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.

Сервер запускается с любого порта #за исключением 8080. Так как я решил открыть порт с 8383, в результате он успешно запустился

С портом 8080 error_log генерировался как

[07-Oct-2018 06:11:02 Etc/GMT] PHP Fatal error:  Uncaught RuntimeException: Failed to listen on "tcp://0.0.0.0:8080": Address already in use in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php:164
Stack trace:
#0 /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/Server.php(36): React\Socket\TcpServer->__construct('tcp://0.0.0.0:8...', Object(React\EventLoop\StreamSelectLoop), Array)
#1 /home/somelabz/public_html/chatroom-php-mysql/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php(59): React\Socket\Server->__construct('0.0.0.0:8080', Object(React\EventLoop\StreamSelectLoop))
#2 /home/somelabz/public_html/chatroom-php-mysql/bin/server.php(15): Ratchet\Server\IoServer::factory(Object(Ratchet\Http\HttpServer), 8080)
#3 {main}
  thrown in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php on line 164

server.php

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
   new HttpServer(
     new WsServer(
          new Chat()
    )
   ),
   8383
);
$server->run();

chatroom.php

// For other computers to connect, you will probably need to change this to your LAN IP or external IP,
// alternatively use: gethostbyaddr(gethostbyname($_SERVER['SERVER_NAME']))
// $Server->wsStartServer($_SERVER['SERVER_ADDR'], 9300);
var conn = new WebSocket('ws://localhost:8383');
<script type="text/javascript">
        $(document).ready(function(){
            var conn = new WebSocket('ws://localhost:8383');
            conn.onopen = function(e) {
                console.log("Connection established!");
            };

    ...
</script>

Проверка консолиинформацию из браузера, которую я использовал для получения следующих журналов, когда я пытался переключить / изменить имя домена, а также порт #, играющий с перестановками и комбинациями из файла chatroom.php и server.php

var conn = новый WebSocket ('ws: // localhost: 8383');
var conn = новый WebSocket ('ws: //192.197.161.61/~somelabz: 8383');
var conn = новый WebSocket('ws: //somelabz.ml/chatroom-php-mysql: 8383');
var conn = new WebSocket ('ws: //somelabz.ml: 8383 /');
var conn = new WebSocket ('ws: //192.197.161.61: 8383 /');

Раньше я получал следующие ошибки:

chatroom.php: 73 Сбой подключения WebSocket к 'ws: //somelabz.ml: 8383 /': ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT

chatroom.php: 73 Подключение WebSocket к 'ws: //192.197.161.61/~somelabz:8383 'не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Соединение WebSocket с' ws: //somelabz.ml/chatroom-php-mysql: 8383 'не удалось:Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 404

Ошибка подключения WebSocket к 'ws: //somelabz.ml: 8383 /': Ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT

Соединение WebSocketto 'ws: //192.197.161.61: 8383 /' не удалось: ошибка при установлении соединения: net :: ERR_CONNECTION_TIMED_OUT

Как мне разрешить / преодолеть при подключении его с WebSocket, особенно с хост-сервера с таким доменным именем, как http://somelabz.ml/chatroom-php-mysql

var conn = new WebSocket('ws: // localhost: 8383');

Это были файлы композитора, созданные после выполнения и добавления папки src $composer require cboden/ratchet

composer.json (Вкл.Сервер)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.1"
    }
}

composer.json (на локальном хосте)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.3"
    }
}

1 Ответ

0 голосов
/ 08 октября 2018

Окончательный вывод -

У вас никогда не будет других вариантов запуска каких-либо служб на сервере Аккаунта перепродавца, даже если Node.js

Решения заключаются либо визменив наш код или обновив / купив сервер:

  1. AJAX Long Pooling
  2. Выделенный хостинг
  3. Виртуальный частный сервер (VPS)

Во-первых,

Ну, сайт Bluehost пишет:

«Мы блокируем доступ к определенным портам, чтобы избежать дыр в безопасности в брандмауэре ... Покупка выделенного IP-адреса позволит нам предоставить вам доступ к портам, на которых вам понадобятся ваши конкретные службы».

Поскольку сервер BlueHost блокирует входящие запросы к сокету на определенных портах, это связано с тем, что они не разрешают использование WebSocket на виртуальном хостинге.Единственный способ получить аналогичный результат - использовать AJAX Long Pooling или нам нужно обновить виртуальный сервер для запуска ваших собственных служб.

мы не должны запускать такие скрипты, как phpwebsocket, внутривеб-сервис (это сам сервер).Это сбивает с толку многих, поскольку PHP обычно используется для создания сценариев веб-страниц, а не для кодирования демонов

Я говорю это потому, что упомянул запуск скрипта в Xampp и назвал службу хостинга 'Bluehost.В этом случае нам нужно перейти на пакет виртуального сервера, чтобы вы могли запускать свои собственные службы.

Есть до 65 535 портов.Веб-сервер не может использовать порты ниже 1024 в качестве прослушивающих сокетов,потому что на большинстве систем порты ниже, которые требуют привилегий root.Ни один здравомыслящий провайдер не запускает веб-сервер от имени пользователя root.Это влияет на все серверы Linux.Вот почему он работает на Xampp с портами # 443 и 80 в httpd-ssl.conf и httpd.conf соответственно.Нам нужно иметь выделенный сервер.По крайней мере, виртуальный.

Во-вторых,

Перед прослушиванием сокета я должен сначала связать его с адресом.Привязка к адресу точно определяет, на каком интерфейсе должен быть открыт этот порт сервера.Привязка к 0.0.0.0 - это особый случай, когда вы хотите прослушать все IP-адреса, известные интерфейсу.Привязка конкретно к 127.0.0.1 должна сделать порт сервера видимым только для кода, который может подключаться к локальному узлу (например, к локальным процессам).Привязка может использоваться только для приема локальных соединений.Если у вас несколько IP-адресов, вы также можете иметь разные серверы, прослушивающие один и тот же порт, но с разных IP-адресов.

...