2015-08-28 5 views
2

Я сделал создание клиент/сервер учебник Приводимые здесьHaxe: подключение к удаленному хосту

http://old.haxe.org/doc/neko/client_server,

, но этот пример только действительно относится к случаю локального хоста, который довольно ограничен утилита. Я надеялся, что кто-то может объяснить, как расширить это на случай подключения к удаленному хосту. В частности, если кто-то знает, как изменить этот пример, чтобы я мог запускать код сервера с ноутбука дома и иметь друга (который знает мой домашний ip), запускать клиент.

код клиента: Код

// file Client.hx 
class Client { 
    static function main() { 
     var s = new sys.net.Socket(); 
     s.connect(new sys.net.Host("localhost"),5000); 
     while(true) { 
      var l = s.input.readLine(); 
      trace(l); 
      if(l == "exit") { 
       s.close(); 
       break; 
      } 
     } 
    } 
} 

Сервер:

// file Server.hx 
class Server { 
    static function main() { 
     var s = new sys.net.Socket(); 
     s.bind(new sys.net.Host("localhost"),5000); 
     s.listen(1); 
     trace("Starting server..."); 
     while(true) { 
      var c : sys.net.Socket = s.accept(); 
      trace("Client connected..."); 
      c.write("hello\n"); 
      c.write("your IP is "+c.peer().host.toString()+"\n"); 
      c.write("exit"); 
      c.close(); 
     } 
    } 
} 

Как отказ, я очень мало знаю о протоколах связи, поэтому прошу прощения, если вопрос глупый.

Edit:

Если я заменить «локальный хост» с моим локальным IP-адресом «192.168.1.254» это по-прежнему работает, но если я заменю «локальный» с моим общественной IP-адресом «206.XXX.XXX. XXX ", клиент не подключается (это было первое, что я пробовал).

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

Edit:

Оказывается, что это было на самом деле работает все вместе с адресом IP публики, но по какой-то причине он не может подключиться к общественному IP маршрутизатора из моей локальной сети (я до сих пор не понимаю почему это было проблемой - возможно, какая-то странная проблема NAT с маршрутизатором). С помощью этой утилиты:

http://www.yougetsignal.com/tools/open-ports/

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

+0

Имейте в виду, что ваш друг, вероятно, не увидит ваш компьютер, даже если он знает ip вашего домашнего подключения из-за NAT. – npretto

+0

Как вы можете обойти это? –

+0

Вам нужно выполнить поиск по «переадресации портов» на вашем маршрутизаторе (он изменяется для каждой марки/модели), вам в основном нужно сопоставить некоторый порт вашего общедоступного ip с другим портом вашего компьютера. Если вы не знаете, что такое NAT, я рекомендую вам Google, что у меня нет ссылки для этого, так как я изучал его в школе, но это довольно интересно, и, вероятно, вы не можете заниматься сетевыми процессами, не зная. – npretto

ответ

3

В клиентах код в поле ниже строки заменить «локальный» с IP-адресом:

s.connect(new sys.net.Host("localhost"),5000); 

http://api.haxe.org/sys/net/Host.html

Создает новый хост: имя может быть IP в форме «127,0 .0.1 "или имя хоста, например" google.com ", и в этом случае соответствующий IP-адрес разрешается с использованием DNS. Исключение возникает, если имя узла невозможно найти.

+0

Это работает, если я заменил «локальный хост» на свой локальный IP-адрес «192.168.1.254», но если я заменил «localhost» на свой общедоступный IP-адрес «206.XXX.XXX.XXX», клиент не подключился (это было первое, что я пробовал). Я отключил свой брандмауэр как для входящего, так и исходящего трафика на этом порту, но он, похоже, не имеет значения. Почему мой экземпляр клиента может подключаться только к экземпляру сервера локально? Я бы хотел, чтобы это изменило клиентский код, чтобы использовать общедоступный IP-адрес компьютера, маршрутизирующего запрос через маршрутизатор. –

+2

Публичный IP-адрес указывает на ваш маршрутизатор. Вы настроили его для пересылки данных в систему, в которой работает служба? https://en.wikipedia.org/wiki/Port_forwarding –

0

Это действительно зависит от вашей домашней установки. Как правило, это угроза безопасности, чтобы просто открыть что-то на вашем домашнем ip, так что сделайте это на свой страх и риск.

Скорее всего, у вас будет динамический IP-адрес от вашего isp. Это означает, что каждый раз, когда вы подключаетесь к своему isp, ваш общедоступный ip может быть другим. Его общее использование стороннего сервиса, чтобы обойти эту вещь. Многие маршрутизаторы имеют встроенную функцию для интеграции с этими провайдерами, но есть и собственные приложения, которые вы можете установить.Есть много услуг, там некоторые бесплатные, некоторые оплачиваются в зависимости от того, что вы хотите, и кому вы доверяете, например http://www.noip.com/, http://dyn.com/dns/. У этих служб будут начатые руководства.

При его работе вы можете изменить свой код клиента с localhost на общедоступный IP-адрес и порт, который вы устанавливаете для службы динамического dns.

+0

Большое спасибо, я попробую попробовать это. –

Смежные вопросы