Python + розетки - PullRequest
       19

Python + розетки

5 голосов
/ 21 апреля 2009

Мне нужно создать сервер подключения клиента <=>. Я использую этот код: Сервер:

import socket

HOST = 'localhost'
PORT = 50007      
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

Клиент:

import socket

HOST = 'localhost'   
PORT = 50007             
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

Работает отлично! Но если сервер создан на компьютере, на котором нет маршрутизатора. Если у вас есть маршрутизатор, перед созданием сервера вы должны открыть порт 50007 на вашем модеме. Как я могу создать сервер на всех компьютерах без включения порта? Торрент-клиенты делают это как-то. Спасибо.

Ответы [ 2 ]

7 голосов
/ 21 апреля 2009

Вопрос немного сбивает с толку, но я постараюсь помочь. В основном, если порт (50007) заблокирован на сервере с помощью брандмауэра, вы НЕ сможете установить TCP-соединение с ним с клиента. Это цель брандмауэра. Многие протоколы (например, SIP и bittorrent) используют стратегии навигации межсетевого экрана и NAT, но это сложная тема, которую вы можете получить более подробную информацию здесь . Вы заметите, что для эффективного использования bittorrent необходимо включить переадресацию портов для NAT и разблокировать диапазоны портов для брандмауэров. Кроме того, bittorrent использует TCP-соединения для большей части передачи данных. Вот вынос:

Во-первых, обратите внимание, что программа BitTorrent должна устанавливать два типа соединений:

  • Исходящие HTTP-соединения с трекером, обычно через порт 6969.
  • Входящие и исходящие соединения с одноранговыми компьютерами, обычно через порт 6881 и выше.
2 голосов
/ 21 апреля 2009

Очень сложно понять твой вопрос ...

(...) Torrent-клиенты делают это как-то.

Torrent-клиенты могут делать это только тогда, когда маршрутизатор - устройство интернет-шлюза (IGD) - поддерживает протокол uPNP . Интересной частью вашей проблемы является раздел о прохождении NAT .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...