Python Socket связь между сетями не работает - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь настроить связь между мной и компьютером моего друга с помощью модуля socket .Я запускаю код сервера на своем компьютере, а он запускает код клиента на своем компьютере.Вот код:

Сервер:

import socket

host = "XXX.XXX.XX.XXX" # IP of my computer
port = 2000

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))

addrs = []

print("Server started")
while True:
    data, addr = s.recvfrom(1024)
    if not addr in addrs:
        addrs.append(addr)
    data = data.decode("utf-8")
    print("Recieved: " + str(data))
    print("Sending: " + data)
    for add in addrs:
        s.sendto(data.encode("utf-8"), add)

Клиент:

import socket
import time

host = "XXX.XXX.XXX.XXX" # External IP of my router
port = 2001

server = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)

while True:
    message = "Test message"
    time.sleep(1)
    print("Sending: " + message)
    s.sendto(message.encode("utf-8"), server)
    try:
        data, addr = s.recvfrom(1024)
    except BlockingIOError:
        pass
    else:
        data = data.decode("utf-8")
        print("Recieved: " + str(data))

Примечание. Порт в коде клиента и сервера отличается, чтобы убедиться, чтомоя переадресация портов на самом деле что-то делает.

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

Может ли эта проблема возникать из моего кода или более вероятно, что мой маршрутизатор неправильно настроендо

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Этот код на самом деле на 100% правильный, ошибка была в моей переадресации порта.

0 голосов
/ 27 мая 2018

Хорошо, я установил HotSpot на свой телефон Android.который в данном случае является вашим «Маршрутизатором», использовал IP-адрес моего телефона.и На компьютере попытался запустить код вашего клиента, его отправка тестовых сообщений на клиенте:

Отправка: тестовое сообщение Отправка: тестовое сообщение Отправка: тестовое сообщение Отправка: тестовое сообщение ....

но я ничего не получаю на вашем Сервере, все еще говоря, что сервер запущен.

, поэтому я настроил переменную вашего хоста в «Клиентском приложении» следующим образом, также ваши порты не совместимы 2000 на сервере и 2001 на клиенте:

host = "" # Внешний IP порта моего маршрутизатора = 2000 ПРИМЕЧАНИЕ!Я оставил хост пустым

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

host = "localhost" # Внешний IP-адрес моего маршрутизатора

в клиентском приложении.

Вот так все выглядит.

Код сервера Запустите это на своем компьютере.

import socket

host = "" # IP of my computer
port = 2000

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))

addrs = []

print("Server started")
while True:
    data, addr = s.recvfrom(1024)
    if not addr in addrs:
        addrs.append(addr)
    data = data.decode("utf-8")
    print("Recieved: " + str(data))
    print("Sending: " + data)
    for add in addrs:
        s.sendto(data.encode("utf-8"), add)

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

ClientApp Code запустите это на своем другом компьютере или более.или даже на android.

import socket
import time

host = "ip_of_the_computer_the_server_is_running_on" # connecting from another computer
#host = "localhost" # If you connecting locally

port = 2000

server = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)

while True:
    message = "Test message"
    time.sleep(1)
    print("Sending: " + message)
    s.sendto(message.encode("utf-8"), server)
    try:
        data, addr = s.recvfrom(1024)
    except BlockingIOError:
        pass
    else:
        data = data.decode("utf-8")
        print("Recieved: " + str(data))

И используйте свой маршрутизатор только для подключения к той же точке доступа. Протестировано с моей TOTO-LINK.пока я не использую IP-адрес моего маршрутизатора на клиентском хосте.

Демонстрации Сервер Server Code Running and recieving from Android and localhost

Клиент

Client on computer Sending Tests

Клиент на мобильном телефоне enter image description here

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