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ć
相关产品推荐
相关产品推荐

