Socket.io доступен только в локальной сети [дубликат]

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

Прежде всего функции программирования! = математические функции .

  • Функции не обязательно должны иметь вход
  • Функции не должны иметь выход
  • Функции не должны отображать входные данные на выходе (из-за двух предыдущих точек пули)

Функция в плане программирования для просмотра просто как блок памяти с началом (точка входа функции), тело (пустое или иное) и точка выхода (одна или несколько в зависимости от реализации), все из которых существуют для повторного использования кода, который вы написали. Даже если вы не видите этого, функция всегда «возвращает» что-то. Это что-то на самом деле является адресом следующего оператора сразу после вызова функции. Это то, что вы увидите во всей своей славе, если вы сделаете какое-то действительно низкоуровневое программирование на языке ассемблера (я смею пойти на лишнюю милю и сделать какой-то машинный код вручную, как Линус Торвальдс, который так часто упоминает об этом во время его семинары и интервью: D). Кроме того, вы также можете внести некоторый вклад, а также вывести какой-то вывод. Вот почему

  def foo (): pass  

- совершенно правильная часть кода.

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

Не было бы дешевле памяти разумно вернуть None затем создать новый пустой кортеж или эта разница во времени слишком мала, чтобы заметить даже в больших проектах?

Насколько я знаю - да, возвращая NoneType Объект был бы намного дешевле памяти. Вот небольшой эксперимент (возвращаемые значения - байты):

  & gt; gt;  sys.getsizeof (None) 16 & gt;  sys.getsizeof (()) 48  

На основе типа объекта, который вы используете в качестве возвращаемого значения (числовой тип, список, словарь, кортеж и т. д.) Python управляет памятью в разных пути, включая первоначально зарезервированное хранилище.

Однако вы также должны рассмотреть код, который находится вокруг вызова функции, и как он обрабатывает все, что возвращает ваша функция. Вы проверяете на NoneType ? Или вы просто проверяете, имеет ли возвращенный кортеж длину 0? Это распространение возвращаемого значения и его типа ( NoneType по сравнению с пустым кортежем в вашем случае) может оказаться более утомительным для обработки и раздувания в вашем лице. Не забывайте, что сам код загружается в память, поэтому, если обработка NoneType требует слишком большого количества кода (даже небольших фрагментов кода, но в большом количестве), лучше оставить пустой кортеж, что также позволит избежать путаница в сознании людей, использующих вашу функцию и забывающих, что она фактически возвращает 2 типа значений.

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

Однако Python является объектно-ориентированным языком и как таковым наследованием, абстрактными классами и т. Д., И все это часть всех махинаций ООП. Это может привести даже к созданию классов «на лету», которые я обнаружил несколько месяцев назад, и был ошеломлен (никогда не видел этого на C / C ++).

Боковое примечание: Вы можете немного прочитать о метаклассах и динамических классах в этой хорошей обзорной статье с большим количеством примеров.

На самом деле существует несколько шаблонов и методов проектирования, которые бы существует даже без так называемых полиморфных функций. Ниже я даю вам две очень популярные темы (не могу найти лучший способ обобщить оба в одном терминале):

  • Duck typing - часто часть динамического набирать языки, которые Python является представителем
  • Factory шаблона проектирования метода - в основном это функция, которая возвращает различные объекты на основе ввода, который он получает.

Наконец, полностью ли ваша функция возвращает один или несколько типов на основе проблемы, которую вы должны решить. Можно ли злоупотреблять этим полиморфным поведением? Конечно, как и все остальное.

7
задан tzortzik 26 February 2012 в 17:54
поделиться

5 ответов

Короткий ответ:

. Решением этого будет поиск «внешнего IP» вашего маршрутизатора и включение пересылки портов для портов 80 и 443 на ваш локальный IP.

Длинный ответ:

Интернет разделен на «публичные» и «частные» IP-пространства. Частные IP-адреса обычно не доступны напрямую из «общедоступного» IP-адреса. IP-адреса из 192.168.0.1-255 относятся к одной из этих частных подсетей.

Ваш маршрутизатор (дома) обычно имеет несколько IP-адресов. Один или несколько из вашей локальной частной сети (192.168.0.X) и один из вашего локального интернет-провайдера (я думаю, что-то вроде 193.xxx.xxx.xxx, потому что ваш DNS находится в этой сети), который находится из «общедоступного» пространства.

Чтобы подключиться к вашему компьютеру с помощью частного IP-адреса из общедоступного IP-адреса, такого как 254.231.52.xxx, вам нужно будет подключиться к общедоступному IP-адресу вашего маршрутизатора (193 ... один). Вам также необходимо включить механизм, называемый «переадресация портов». Этот effectivley передает весь интернет-трафик, поступающий на общедоступный IP-адрес вашего маршрутизатора на переадресованных портах, и передает его на частный IP-адрес, на который настроен переадресация. Например. 254.231.52 .. -> 193 ...: 80 -> 192.168 ...: 80 Обычно домашние маршрутизаторы имеют страницу конфигурации, где вы можете это сделать. Необходимые порты, которые вы, вероятно, используете, - 80 (http) и 443 (https).

Другой возможностью является использование так называемых http-прокси, которые также обычно поддерживаются в качестве параметра конфигурации одного домашнего маршрутизатора. Для получения инструкций по настройке вы должны обратиться к руководству своего маршрутизатора.

10
ответ дан Bernd May 16 August 2018 в 00:03
поделиться
  • 1
    Я в университетском городке, и у меня нет доступа к маршрутизатору. Идея заключалась в том, чтобы получить доступ к моему серверу с работы без переноса файлов из моего места в рабочее пространство. Вывод заключается в том, что я не могу ничего сделать для доступа к моему серверу. Спасибо! – tzortzik 26 February 2012 в 20:37

Большинство шлюзов (маршрутизатор) имеют параметр VirtualServer, который вы можете указать на локальный сервер (192.168.0.50)

. Вы можете использовать что-то вроде dyndns.org для установки постоянного имени хоста на ваш сервер. то есть mylocalserver.dyndns.org

1
ответ дан Bjørne Malmanger 16 August 2018 в 00:03
поделиться

Что вам нужно, чтобы идентифицировать ваш домашний компьютер со всего Интернета, чтобы получить доступ извне.

Этот учебник поможет вам http://kyokasuigetsu25.wordpress.com/2011/ 01/21 / how-to-access-localhost-of-computers-outside-the-network /

Но если у вас есть только простые html-файлы (css, js too), вы можете использовать Dropbox и обмениваться папками ваших сайтов. Таким образом, вы можете работать локально, и файлы будут синхронизироваться с вашей общей папкой

Надеюсь, что это поможет

1
ответ дан Mc- 16 August 2018 в 00:03
поделиться

Если у вас достаточно привилегий для настройки маршрутизатора (на шлюзовой машине), для этого вы можете использовать «переадресацию портов».

Перейдите к настройкам маршрутизатора и настройте его так, чтобы он пересылал пакеты, которые он получает на порт 80, на ваш компьютер. Предполагая, что ваш маршрутизатор имеет действующий IP-адрес (например, xxxx), вы можете получить доступ к вашему серверу Apache: http: // xxxx / .

Вы можете использовать любой другой порт вместо 80 и конечно же получите доступ к вашему Apache через http: // xxxx: PORT / .

Если у вас нет достаточных привилегий, то ничего не приходит мне в голову, кроме как с использованием обратного туннелирования с использованием SSH или аналогичные протоколы.

0
ответ дан Mehdi Behrooz 16 August 2018 в 00:03
поделиться

Открытое имя вашего компьютера должно быть настроено в DNS, чтобы указать на маршрутизатор вашей сети. Затем вам нужно настроить маршрутизатор для перенаправления трафика для этого имени на машину. Также необходимо настроить брандмауэр, чтобы это разрешить.

0
ответ дан Roland Smith 16 August 2018 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: