Связь между компьютерами через внешние сети - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь создать приложение с моим Raspberry Pi 3B, которое получает некоторые данные от подключенных датчиков.Как только я получу данные, я бы хотел отправить их на стационарный компьютер, который находится во внешней сети, через скрипт на Python и библиотеку сокетов.Вот мой код:

На стороне сервера (внешний компьютер):

import socket

ip = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] 
or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) 
+ ["no IP found"])[0]
print("IP ordinateur local: {}".format(ip))

port = 9999
print("Port d'entrée des données sur l'ordinateur local: {}".format(port))

address = ("",port)

serveur = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serveur.bind(address)

serveur.listen(5)
print("En attente de nouvelles connexions")

client, infosClient = serveur.accept()

print("Nouvelle connexion client établie")
print("Infos client: IP = {}, port = {}".format(infosClient[0],infosClient[1]))

msg = "Serveur: connexion acceptee"
client.send(msg.encode())

flag = False
try:
    while True:
        if flag == False:
            msgRecu = client.recv(1024)
            print("Message reçu: {}".format(msgRecu.decode()))
            msg = input("Entrez une réponse à envoyer \n")
            client.send(msg.encode())
            print("Réponse envoyée")
            print("En attente de la commande d'arrêt")
            flag = True
except KeyboardInterrupt:
    msg = "Le serveur a enclenché la commande d'arret Ctrl+C"
    client.send(msg.encode())
finally:
    print("Fermeture de la connexion")
    client.close()
    serveur.close()

На стороне клиента (RPi):

import socket

ipLocal = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] 
or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) 
+ ["no IP found"])[0]

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

ipServeur = input("Entrez l'adresse IP du serveur \n")
portServeur = input("Entrez le port du serveur \n")

try:
    client.connect((ipServeur,int(portServeur)))
except KeyboardInterrupt:
    del client


print("Connexion établie")

msgRecu = client.recv(1024)
print(msgRecu.decode())

msg = input("Entrez un message à envoyer \n")

client.send(msg.encode())
print("Message envoyé")

answer = client.recv(1024)

print("Réponse serveur: {}".format(answer.decode()))

print("Fermeture de la connexion")
client.close()

К сожалению, когда я ввожу IP-адрес, который серверный сценарий дает мне с помощью первой команды (ip = ...), клиентский сценарий сообщает мне, что я подключен, но серверный еще ожидает подключения.

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

...