python - 如何通过 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 数据包发送到本地机器上的服务器?
提前致谢。
解决方案
由于远程客户端在“云中”(即运行在 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 并且已启用,则您的服务器可以在绑定/关闭其侦听套接字时在代码中动态配置这些规则。否则,您将不得不使用路由器的管理界面手动配置规则。
推荐阅读
- python - 如何在python中使用for循环从可用数据中创建一个函数
- spring - 我可以使用 API 调用通过 Spring Security 对不同的应用程序进行身份验证吗?
- neo4j - 无法将 Neo4j 商店从 3.2.2 升级到 3.5.1
- jquery - 真正不起作用的Angular 6中的数据背景
- php - 当父构造加载失败时,从另一个子类加载函数失败
- design-patterns - 具有受保护创建和公共读取访问权限的可区分联合的功能设计模式是什么?
- javascript - 将鼠标悬停在列表上时传单打开弹出窗口
- git - 通过 AWS CodeCommit Repo 上的 SSH 授予对 Ionic 应用程序构建的访问权限
- r - 如何从 lmer 绘制和提取不同组的斜率和截距值?
- java - size(int x, int y) 在构建处理库路径后运行但在 intellij 中不起作用