Windows环境下Python读取UDP端口9001数据无输出问题排查
解决Windows 10下UDP端口9001监听无输出问题
一、Python脚本核心修复方案
1. 优化绑定逻辑与数据解码
原脚本的绑定逻辑和数据处理存在潜在问题,调整后的脚本更鲁棒:
import socket # 替换为你的Windows机器实际网卡IP(可通过ipconfig查看) LOCAL_IP = "192.168.1.100" PORT = 9001 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 显式绑定到指定网卡,避免多网卡环境下的接收遗漏 sock.bind((LOCAL_IP, PORT)) print(f"UDP监听已启动: {LOCAL_IP}:{PORT}") while True: # 使用recvfrom更明确获取发送方地址 data, addr = sock.recvfrom(1024) try: # 优先尝试UTF-8解码 message = data.decode("utf-8") except UnicodeDecodeError: # 兼容ASCII或二进制数据,避免解码崩溃 message = data.decode("ascii", errors="replace") print(f"[{addr[0]}:{addr[1]}] 收到数据: {message}")
2. 检查并配置Windows防火墙
Windows Defender防火墙大概率拦截了UDP 9001的入站流量:
- 打开「Windows Defender防火墙」→「高级设置」→「入站规则」
- 新建规则:选择「端口」→ 勾选「UDP」→ 输入本地端口
9001→ 选择「允许连接」→ 勾选所有网络类型 → 命名规则(如「允许UDP 9001入站」)
3. 验证端口是否被占用
在PowerShell中执行命令,确认9001端口未被其他进程占用:
netstat -ano | findstr ":9001"
若输出存在其他进程,需终止对应PID的进程或更换监听端口。
二、PowerShell脚本错误修复
原脚本存在变量提前引用的逻辑错误,修改后可正常运行:
function Start-UDPServer { [CmdletBinding()] param ( [Parameter(Mandatory = $false)] $Port = 10000 ) $RemoteComputer = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0) # 先创建UdpClient再输出监听信息,避免变量未定义错误 $UdpObject = New-Object System.Net.Sockets.UdpClient($Port) Write-Host "服务已启动,监听地址: $($UdpObject.Client.LocalEndPoint)" Write-Host "按CTRL+C停止服务" do { try { $ReceiveBytes = $UdpObject.Receive([ref]$RemoteComputer) $ASCIIEncoding = New-Object System.Text.ASCIIEncoding [string]$ReturnString = $ASCIIEncoding.GetString($ReceiveBytes) [PSCustomObject]@{ LocalDateTime = $(Get-Date -UFormat "%Y-%m-%d %T") SourceIP = $RemoteComputer.address.ToString() SourcePort = $RemoteComputer.Port.ToString() Payload = $ReturnString } } catch { Write-Warning "接收数据出错: $_" } } while ($true) $UdpObject.Close() }
执行方式:先加载函数再调用
. .\Start-UDPServer.ps1 Start-UDPServer -Port 9001
三、额外验证步骤
- 本地发送测试数据,确认监听功能正常:
$udpClient = New-Object System.Net.Sockets.UdpClient $udpClient.Connect("127.0.0.1", 9001) $bytes = [System.Text.Encoding]::UTF8.GetBytes("测试UDP消息") $udpClient.Send($bytes, $bytes.Length) $udpClient.Close()
若本地发送能收到,说明问题出在跨设备的网络路由或目标网卡绑定上。
- 核对Wireshark捕获的数据包:确认目标IP是Windows机器的正确网卡IP,目标端口确实为9001,且数据包未被路由或NAT丢弃。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

