python - 通过全球公共 IP 地址连接的 Python 套接字
问题描述
我一直在做一个项目,通过 Python 将位于不同位置的计算机连接在一起。最初,在测试时,我使用我的私有 IP 地址(当时我不知道它是私有的)来连接与我在同一网络上的计算机。但是,当我尝试对位于不同位置的不同网络上的计算机执行此操作时,它根本不起作用。
我认为这是因为该程序正在使用我的计算机的本地 IP 地址,该地址只能连接到同一网络上的计算机。这是我的简化程序:
这是我的服务器端脚本:
server = socket.gethostbyname(socket.gethostname()) # 10.128.X.XXX which is the Internal IP
print(server)
port = 5555
clients = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((server, port))
s.listen(2)
print("Waiting for connection...")
while True:
conn, addr = s.accept()
print("Connected to: ", addr)
conn.send(str.encode(f"{clients}"))
clients += 1
这是我的客户端脚本:
class Network:
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server = "10.128.0.2"
self.port = 5555
self.addr = (self.server, self.port)
self.id = int(self.connect())
def connect(self):
self.client.connect(self.addr)
return self.client.recv(2048).decode()
network = Network()
print(f"Connected as client {network.id}")
现在,当我尝试用全局 IP 地址替换私有 IP 地址时(如此处指定:如何在 Python 中获取套接字的外部 IP?)我收到以下错误:
# Getting the Global IP Address
from requests import get
server = get("https://api.ipify.org").text
s.bind((server, port))
OSError: [WinError 10049] The requested address is not valid in its context
我已经尝试过很多关于如何使用不同网络在位于不同位置的多台计算机之间进行通信(将少量数据作为字符串传输)的搜索,但我还没有真正得到解决方案。有没有办法我可以做到这一点?
解决方案
在您总是使用的服务器local IP
中(它是计算机中一张网卡的 IP 或0.0.0.0
使用所有网卡)
s.bind( (local_IP, port) )
# or
s.bind( ('0.0.0.0', port) )
在您使用的客户端external IP
s.connect( (external_IP, port) )
外部客户端用于external IP
连接您的 Internet 提供商路由,该路由器知道这external IP
是分配给您的计算机的,并将其重定向到您的服务器。
同时本地客户端可以local IP
用来连接同一个服务器。
external_client --> router(externa_IP) --> server(local_IP) <-- local_client
推荐阅读
- c++ - 有没有办法从两个图像创建一个垫子,同时保持图像的参考
- groovy - 用 groovy 迭代嵌套的 json
- python-3.x - 矩阵只产生一半的预期数据
- jsf - 如果在 jsf 中选中了某些复选框,如何启用我的按钮?
- libgdx - 如何使 ImageButton 在 libgdx 中看起来被按下?
- git - git remote update origin --prune 对本地更改的影响
- arrays - Perl从数组中输出连续的字符串
- ios - JSON 在 Swift 中编码非原始类型
- docker - 使用卷挂载时 Docker 抛出 Invalid Reference format 异常
- bash - Gnu Parallel:是否为每个作业并行重新加载程序?