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

Flutter安卓模拟器与Python服务器UDP通信故障排查求助

Flutter安卓模拟器与Python服务器UDP连接故障排查

问题描述

我用Dart开发了基于Flutter的安卓应用,在安卓模拟器中运行,目前无法和Python服务器建立UDP通信。此前WebSocket连接完全正常,但UDP没有任何响应,也未抛出任何错误信息。

现有代码

Flutter应用端Dart代码

final serverAddress = InternetAddress('10.0.2.15');
const port = 50001;
_clientSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, port);
_clientSocket.send('Hello from Flutter'.codeUnits, serverAddress, port);

_clientSocket.listen((RawSocketEvent event) {
  if (event == RawSocketEvent.read) {
    Datagram dg = _clientSocket.receive()!;
    String message = String.fromCharCodes(dg.data);
    print('Received message: $message');
  }
});

Python服务器端代码

import socket

localIP = "127.0.0.1"
print(localIP)

localPort = 50001
bufferSize = 1024

UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind((localIP, localPort))
print("UDP server up and listening")

while True:
    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
    message = bytesAddressPair[0]
    address = bytesAddressPair[1]

    clientMsg = "Message from Client:{}".format(message)
    clientIP = "Client IP Address:{}".format(address)

    print(f"{clientMsg}\n{clientIP}\n-----------------\n")

    # Sending a reply to the client
    replyMsg = f"Hello test agent, thanks for messaging!\n-----------------\n"
    UDPServerSocket.sendto(str.encode(replyMsg), address)

故障原因及修复方案

1. 地址映射错误

  • 安卓模拟器中,10.0.2.15是模拟器自身的IP,要访问宿主机的Python服务器,必须使用**10.0.2.2**——这是安卓模拟器官方指定的宿主机localhost映射地址。
  • 同时Python服务器绑定的127.0.0.1仅能接收本地请求,需改为绑定0.0.0.0,让服务器监听所有网卡的UDP请求。

2. 端口绑定冲突

Flutter代码中客户端和服务器使用了相同的50001端口,会导致端口占用。客户端应绑定随机空闲端口,将bind的端口参数改为0即可,系统会自动分配可用端口。

3. 安卓网络权限缺失

确保安卓应用的AndroidManifest.xml中添加了必要的网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

修改后的可运行代码

修改后的Flutter代码

final serverAddress = InternetAddress('10.0.2.2'); // 替换为宿主机映射地址
const port = 50001;
_clientSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0); // 使用随机端口
_clientSocket.send('Hello from Flutter'.codeUnits, serverAddress, port);

_clientSocket.listen((RawSocketEvent event) {
  if (event == RawSocketEvent.read) {
    Datagram? dg = _clientSocket.receive();
    if (dg != null) { // 增加空值判断,避免崩溃
      String message = String.fromCharCodes(dg.data);
      print('Received message: $message');
    }
  }
});

修改后的Python服务器代码

import socket

localIP = "0.0.0.0" # 绑定所有网卡,允许外部访问
print(localIP)

localPort = 50001
bufferSize = 1024

UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind((localIP, localPort))
print("UDP server up and listening")

while True:
    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
    message = bytesAddressPair[0]
    address = bytesAddressPair[1]

    clientMsg = "Message from Client:{}".format(message)
    clientIP = "Client IP Address:{}".format(address)

    print(f"{clientMsg}\n{clientIP}\n-----------------\n")

    # Sending a reply to the client
    replyMsg = f"Hello test agent, thanks for messaging!\n-----------------\n"
    UDPServerSocket.sendto(str.encode(replyMsg), address)

内容的提问来源于stack exchange,提问作者Matija Tomašić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:50:05