使用 python 套接字库与外部网络中的计算机进行对等连接

peer to peer connection to a computer in external network using python socket library

我正在尝试使用套接字库创建点对点 python 应用程序。我很想知道是否有任何方法可以使用套接字库连接到本地网络之外的另一台计算机,而无需任何手动步骤,例如在路由器上打开端口进行端口转发。我是否需要使用路由器上已经打开的端口(假设路由器默认打开了一些端口)?请指导我。我是套接字和网络的新手。

到目前为止我的代码:-

client-1(发件人)

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((MYPUBLICIP, 433))
s.send(b"HELLO!")
s.close()

客户端 2(接收方)

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((MYPRIVATEIP, 433))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"[CONNECTION_ALERT] Received connection request from {addr}.")
        while True:
            data = conn.recv(1026).decode('utf-8')
            if not data:
                break
            print(data)

我得到的错误:

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

如果需要,我的python版本是10

在同一局域网中连接两台主机的解决方案

错误消息提示您的防火墙可能阻止了网络流量,您可以尝试禁用防火墙再试一次,但不建议这样做。如果你想玩网络东西,我建议你创建一个没有连接到互联网的本地实验室,比如 VM 或旧的 laptops/pc.

连接不在同一本地网络上的两台主机的解决方案

如果你想连接不在同一个本地网络的两台主机,那么问题就变得更复杂了,有几种可能的解决方案:

  • 向您的 ISP 询问 public IP(简单但通常需要额外费用)
  • 使用可用的软件解决方案在 Internet 上创建专用网络,例如 hamachi or ngrok(也很简单,但根据用例成本会有所不同)
  • 利用 naive NAT's by using STUN (hard to implement but satisfying if done right, nice explanation of how it was implemented in OpenTTD multiplayer)