HTML5 Websocket работает только на localhost

Я следил за учебником HTML5 Websocket на веб-сайте ниже:

http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

Это сработало хорошо, затем я изменил значение хоста с "localhost: 8080" на "218.175.192.160:8080" (мой ip) на клиентской странице, серверная сторона все еще сохраняла "localhost: 8080".

Оказывается, я могу просматривать страницу в браузере (apache) с помощью протокола http, например, http://218.175.192.160:8080/client.html ", однако, сокет на стороне клиента не может подключиться к" ws://218.175.192.160: 8080/daemon.php". (измененная опечатка)

мои вопросы: 1. на стороне клиента, почему websocket работает только на "ws://localhost: 8080/daemon.php", а не "ws://218.175.192.160: 8080/daemon.php"?

2. почему socket_bind ($ socket, "127.0.0.1", 8080) работает, но socket_bind ($ socket, "218.175.192.160", 8080) возникает ошибка? система напоминает "невозможно связать адрес [0]: запрошенный адрес недействителен в его контексте". Я уверен, что адрес Ip ​​принадлежит моему серверу.

Пожалуйста, помогите, спасибо.

Я выяснил причину ошибки: привязка неверного адреса, потому что я использовал маршрутизатор, хотя я установил услугу NAT на маршрутизаторе, но я забыл, что адрес "218.175.192.160" принадлежит интерфейс маршрутизатора, а не моя серверная машина.

адрес серверной машины должен быть локальным типом адреса, например: "192.168.1.2", который действительно находится на интерфейсе локальной карты.

жаль, что я забыл основные сетевые настройки:(, надеюсь, этот пост поможет новичку в сети, как я, спасибо ~:)

Ответы

Ответ 1

У меня тоже была эта проблема.

Проблема в том, что вы, скорее всего, ссылаетесь на свой IP-адрес ROUTER. Что вам нужно сделать, это обратиться к вашему IP-адресу компьютера.

Он работает для localhost, потому что localhost указывает на ваш отдельный компьютер, а не на ваш маршрутизатор.

Ответ 2

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

В вашем примере вы использовали:

http://218.175.192.160:8080/client.html
ws://218.175.192.160/daemon.php

Я не уверен, что это была только опечатка, но это должно быть

http://218.175.192.160:8080/client.html
ws://218.175.192.160:8080/daemon.php

Ответ 3

Вы все еще используете "localhost" для инициализации вашего PHP-сервера таким образом?:

public function __construct($host='localhost',$port=8000,$max=100)  

Если вы это сделаете, сервер будет привязан только к локальному интерфейсу. Даже если вы правильно обслуживаете файл из Apache, похоже, что код phpwebsockets по-прежнему необходимо настроить для внешнего IP-адреса.

Ответ 4

Вместо socket_bind( $socket, "127.0.0.1", 8080 ), который сообщает ему разрешать запросы только из localhost, привязывается к "0.0.0.0", которая разрешает запросы от любого IP-адреса.

Итак, сделайте это socket_bind( $socket, "0.0.0.0", 8080 ), и он будет работать.