You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

三、额外验证步骤

  1. 本地发送测试数据,确认监听功能正常:
$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()

若本地发送能收到,说明问题出在跨设备的网络路由或目标网卡绑定上。

  1. 核对Wireshark捕获的数据包:确认目标IP是Windows机器的正确网卡IP,目标端口确实为9001,且数据包未被路由或NAT丢弃。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:20:52