首页 > 解决方案 > 如何通过 UDP 使用 Python 将数据从远程机器(客户端)发送到本地机器(服务器)?

问题描述

我正在尝试通过 UDP 使用 Python 将数据从云中的远程机器发送到我的本地机器监听。

从我的本地机器运行...(服务器)

from socket import *

serverSocket = socket(AF_INET, SOCK_DGRAM)

serverSocket.bind(('0.0.0.0', 3000))

while True:
    message, address = serverSocket.recvfrom(1024)
    print(message, address)

从云端的远程机器运行...(客户端)

from socket import *

clientSocket = socket(AF_INET, SOCK_DGRAM)

server_addr = (<WHAT GOES HERE?>, 3000)

clientSocket.sendto(b'hello world', server_addr)

我相信 <WHAT GOES HERE?> 应该是我的本地机器的主机名,但我不熟悉如何在服务器运行的本地机器上公开端口。

如何暴露我的本地机器,以便远程云机器上运行的客户端可以成功地将 UDP 数据包发送到本地机器上的服务器?

提前致谢。

标签: pythonsocketstcpudptunneling

解决方案


由于远程客户端在“云中”(即运行在 Internet 上其他地方的另一台机器上),它需要使用您的 ISP 分配给您的公共 IP。在服务器端,您可以使用https://api.ipify.org等网站来发现您的公共 IP,然后将其提供给您的客户端进行连接。或者,您可以向任何公共域注册商(GoDaddy 等)注册一个静态主机名,并将其指向您的公共 IP(如果您的 IP 是动态的,则可以使用动态 DNS 服务来处理这种情况)。

如果您的服务器机器直接连接到您的 Internet 调制解调器,那么您的公共主机名/IP 将直接路由到您的服务器机器。

                 --------
     ----------> | 域名解析 | ----------
     | -------- |
     | \|/
---------- ------------ --------------
| 客户 | <-> | 互联网 | <-> |x:x| 服务器 |
---------- ------------ --------------

但是,如果您的服务器没有直接连接到调制解调器,而是在 NAT 路由器后面运行,那么您的公共主机名/IP 将路由到路由器,而不是您的服务器机器:

                 --------
     ----------> | 域名解析 | ----------
     | -------- |
     | \|/
---------- ------------ -------------- --------------
| 客户 | <-> | 互联网 | <-> |x:x| 路由器| <-> |x:x| 服务器 |
---------- ------------ -------------- --------------

因此,路由器必须单独配置端口转发规则,以将入站流量从其公共 WAN IP/端口路由到服务器机器的专用 LAN IP/端口。

如果路由器支持 uPNP 并且已启用,则您的服务器可以在绑定/关闭其侦听套接字时在代码中动态配置这些规则。否则,您将不得不使用路由器的管理界面手动配置规则。


推荐阅读