通过外部网络在计算机之间进行通信

时间:2019-05-08 11:57:54

标签: networking python ip raspberry-pi

我正在尝试使用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,但我对它的工作原理并不了解,知道吗?

0 个答案:

没有答案