通过全局公共(public) IP 地址连接的 Python 套接字

标签 python sockets networking ip-address

我一直在做一个项目,通过 Python 将位于不同位置的计算机连接在一起。最初,在测试时,我使用我的私有(private) IP 地址(当时我不知道它是私有(private)的)来连接与我在同一网络上的计算机。但是,当我尝试对位于不同位置的不同网络上的计算机执行此操作时,它根本不起作用。
我认为这是因为该程序正在使用我的计算机的本地 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 地址替换私有(private) IP 地址时(如此处指定: How do I get the external IP of a socket in Python? )我收到以下错误:
# 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

关于通过全局公共(public) IP 地址连接的 Python 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62631176/

相关文章:

java - 停止线程等待网络 Activity 的正确方法是什么?

python - 从按钮搜索结果返回以显示在 OpenERP 的同一页面上

java - 有没有办法确定哪个 OutputStream 当前正在发送到我的套接字输入流?

c - 在部署新代码或热插拔代码时维护套接字连接?

java - 如何在 java 中解析代理 socks 数据包?

java - 尝试连接外部 IP 时连接被拒绝

python - Pandas - 根据列中的列表从数据框中选择行

python - 如何结束周长计算循环

python - 为什么可以将属性添加到对象子类的实例,而不是对象的实例?

c++ - 使用winsock发送缓冲区后是否可以删除内存?