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