如何使用 Python 通过 UDP 从远程机器(客户端)向本地机器(服务器)发送数据?
How to send data with Python over UDP from remote machine (client) to local machine (server)?
我正在尝试使用 Python 通过 UDP 从云中的远程机器发送数据到我正在监听的本地机器。
运行 来自我的本地机器...(服务器)
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)
我相信 应该是我本地机器的主机名,但我不熟悉如何在服务器 运行 所在的本地机器上公开端口。
如何公开我的本地机器,以便远程云机器上的客户端 运行 可以成功地将 UDP 数据包发送到本地机器上的服务器?
提前致谢。
如果我没理解错的话,你的 IP 地址应该就是你所需要的了。只需 Google 快速搜索即可查找。假设“0.0.0.0”是您的 IP 地址,您可以使用
由于远程客户端“在云端”(即 运行 在互联网上其他地方的另一台机器上),它将需要使用分配给您的 public IP由您的 ISP。在服务器端,您可以使用 https://api.ipify.org 之类的网站来发现您的 public IP,然后将其提供给您的客户端进行连接。或者,您可以在任何 public 域注册商(GoDaddy 等)注册一个静态主机名,并将其指向您的 public IP(如果您的 IP 是动态的,则可以使用动态 DNS 服务来处理这种情况).
如果您的服务器计算机直接连接到您的互联网调制解调器,那么您的 public hostname/IP 将直接路由到您的服务器计算机。
-------
----------> | DNS | ----------
| ------- |
| \|/
---------- ------------ --------------
| client | <-> | Internet | <-> |x:x| server |
---------- ------------ --------------
但是,如果您的服务器没有直接连接到您的调制解调器,而是 运行 在 NAT 路由器后面,那么您的 public hostname/IP 将路由到路由器,而不是到您的服务器计算机:
-------
----------> | DNS | ----------
| ------- |
| \|/
---------- ------------ -------------- --------------
| client | <-> | Internet | <-> |x:x| router | <-> |x:x| server |
---------- ------------ -------------- --------------
因此,路由器必须单独配置 端口转发 规则,以将入站流量从其 public WAN IP/port 路由到您的服务器计算机私人局域网 IP/port.
如果路由器支持 uPNP 并且已启用,您的服务器可以在 binding/closing 其侦听套接字时在代码中动态配置这些规则。否则,您将不得不使用路由器的管理界面手动配置规则。
我正在尝试使用 Python 通过 UDP 从云中的远程机器发送数据到我正在监听的本地机器。
运行 来自我的本地机器...(服务器)
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)
我相信
如何公开我的本地机器,以便远程云机器上的客户端 运行 可以成功地将 UDP 数据包发送到本地机器上的服务器?
提前致谢。
如果我没理解错的话,你的 IP 地址应该就是你所需要的了。只需 Google 快速搜索即可查找。假设“0.0.0.0”是您的 IP 地址,您可以使用
由于远程客户端“在云端”(即 运行 在互联网上其他地方的另一台机器上),它将需要使用分配给您的 public IP由您的 ISP。在服务器端,您可以使用 https://api.ipify.org 之类的网站来发现您的 public IP,然后将其提供给您的客户端进行连接。或者,您可以在任何 public 域注册商(GoDaddy 等)注册一个静态主机名,并将其指向您的 public IP(如果您的 IP 是动态的,则可以使用动态 DNS 服务来处理这种情况).
如果您的服务器计算机直接连接到您的互联网调制解调器,那么您的 public hostname/IP 将直接路由到您的服务器计算机。
------- ----------> | DNS | ---------- | ------- | | \|/ ---------- ------------ -------------- | client | <-> | Internet | <-> |x:x| server | ---------- ------------ --------------
但是,如果您的服务器没有直接连接到您的调制解调器,而是 运行 在 NAT 路由器后面,那么您的 public hostname/IP 将路由到路由器,而不是到您的服务器计算机:
------- ----------> | DNS | ---------- | ------- | | \|/ ---------- ------------ -------------- -------------- | client | <-> | Internet | <-> |x:x| router | <-> |x:x| server | ---------- ------------ -------------- --------------
因此,路由器必须单独配置 端口转发 规则,以将入站流量从其 public WAN IP/port 路由到您的服务器计算机私人局域网 IP/port.
如果路由器支持 uPNP 并且已启用,您的服务器可以在 binding/closing 其侦听套接字时在代码中动态配置这些规则。否则,您将不得不使用路由器的管理界面手动配置规则。