У меня есть веб-приложение, работающее на HTTP-сервере через порт 3000. Это приложение подключено к серверу веб-сокета через порт 9001. И WS, и HTTP-серверы расположены внутри одной виртуальной машины.
При тестировании приложения локально (внутри ВМ) все работает нормально. И веб-приложение, и сервер WS могут взаимодействовать друг с другом. И приложение, и сервер прослушивают соединение на localhost следующим образом:
Веб-приложение (ReactJS): const sock = new WebSocket('ws://localhost:9001/');
Сервер WS (Python): ws = WebsocketServer(host='127.0.0.1', port=9001)
При настройке для разрешения внешних подключений веб-приложение и сервер WS больше не могут взаимодействовать. Сервер по-прежнему прослушивает соединения на host='127.0.0.1'
. Код внешнего интерфейса веб-приложения изменяется для подключения к машине, на которой работает виртуальная машина (скажем, 123.45.67.890
):
Веб-приложение (ReactJS): const sock = new WebSocket('ws://123.45.67.890:9001/');
Я включил переадресацию портов для обоих портов 3000 и 9001 и отключил брандмауэр на обоих портах изнутри виртуальной машины. Оба порта открыты на хост-машине.
Я могу получить доступ к веб-приложению извне, используя 123.45.67.890:3000
, поэтому я почти уверен, что соединение с виртуальной машиной открыто. Однако веб-приложение не взаимодействует с сервером WS через порт 9001. Есть идеи, что может быть причиной этого?
На всякий случай информация об ОС будет полезна:
Хост ВМ: Microsoft Windows 7 Enterprise (6.1.7601 Service Pack 1 Build 7601)
Гость ВМ: CentOS Linux release 7.4.1708 (Core)
Это было довольно легко исправить, и это даже написано в документации веб-сервер что я использую.
Просто необходимо создать экземпляр сервера WS следующим образом ws = WebsocketServer(host='0.0.0.0', port=9001)
так что он прослушивает все входящие соединения.