通过全球公共 IP 地址连接的 Python 套接字

问题描述 投票:0回答:1

我一直在做一个项目,通过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

我尝试了大量搜索如何在位于不同位置、使用不同网络的多台计算机之间进行通信(以字符串形式传输少量数据),但我还没有真正找到解决方案。有什么办法可以做到这一点吗?

python sockets networking ip-address
1个回答
6
投票

在服务器中你总是使用

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
与您的互联网提供商路由连接,并且该路由器知道该
external IP
已分配给您的计算机,并将其重定向到您的服务器。

同时本地客户端可以使用

local IP
与同一服务器连接。

external_client --> router(external_IP) --> server(local_IP) <-- local_client
© www.soinside.com 2019 - 2024. All rights reserved.