Как отправлять сообщения на удаленный компьютер с помощью python модуля сокетов? - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь отправить сообщение с компьютера на другой компьютер, который не подключен к локальной сети другого компьютера. Я сделал переадресацию портов (порт 8080, TCP), и мне не удалось подключиться к удаленному компьютеру и отправить сообщение. когда я пытаюсь подключиться, это просто застревает в методе подключения (клиент).

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

код клиента (удаленный компьютер):

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("%My public IP address%", 8080))
msg = s.recv(1024)
msg = msg.decode("utf-8")
print(msg)

код сервера:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("192.168.0.2", 8080))
s.listen(5)

while True:
   clientsocket, address = s.accept()
   print(f"Connection from {address} has been established.")
   clientsocket.send(bytes("Hey there!!", "utf-8"))
   clientsocket.close()

1 Ответ

0 голосов
/ 28 марта 2020

Насколько я понимаю, ваша цель - подключиться к серверу с удаленного компьютера и отправить сообщение с сервера клиенту. Таким образом, все, что требуется, это клиент для подключения к внешнему IP-адресу вашего сервера. После этого маршрутизатор просто пересылает трафик c в соответствии с правилами переадресации порта.

Сервер:

import socket

def Main():
    host = '10.0.0.140'
    port = 42424
    s = socket.socket()
    s.bind((host, port))

    s.listen(1)
    c, addr = s.accept()
    while True:
        data = c.recv(1024)
        if not data:
            break
        data = str(data).upper()
        c.send(data)
    c.close()
if __name__ == '__main__':
    Main()

Клиент:

import socket

def Main():
    host = '10.0.0.140' #The host on your client needs to be the external-facing IP address of your router. Obtain it from here https://www.whatismyip.com/
    port = 42424 
    s = socket.socket()
    s.connect((host,port))
    message = raw_input("->") 
    while message != 'q':
        s.send(message)
        data = s.recv(1024)
        message = raw_input("->")
    s.close()

if __name__ == '__main__':
    Main()

Также обратите внимание, что при подключении к серверу за межсетевым экраном / маршрутизатором NAT, помимо переадресации портов, клиент должен быть направлен на IP-адрес маршрутизатора. Что касается клиента, IP-адрес маршрутизатора является сервером. Маршрутизатор просто пересылает трафик c в соответствии с правилами переадресации порта.

...