Android虚拟机中ServerSocket无法接收Python客户端连接求助
解决Android虚拟机ServerSocket与Python客户端的连接阻塞问题
核心问题分析
- 端口冲突:你使用的5554是Android模拟器ADB控制台的默认端口,Python客户端连接该端口时,实际对接的是模拟器的ADB服务而非App内的ServerSocket,这就是收到
Android Console: type 'help'...回复的原因。 - 网络绑定限制:默认情况下,ServerSocket仅绑定虚拟机本地的
127.0.0.1,只能接受虚拟机内部的连接请求,无法响应主机的连接。 - 缺少端口转发:Android模拟器采用NAT网络模式,主机无法直接访问虚拟机内部的IP和端口,必须通过ADB建立端口转发通道。
具体修复步骤
1. 更换ServerSocket端口并调整绑定地址
将Android代码中的端口从5554改为非ADB默认端口(如8888、9999这类未被占用的端口),同时显式绑定到0.0.0.0以允许外部连接:
import java.io.DataInputStream; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class MyServer implements Runnable{ ServerSocket ss; Socket mySocket; DataInputStream dis; @Override public void run() { try { // 绑定到0.0.0.0,允许所有地址的连接请求 ss = new ServerSocket(8888, 5, InetAddress.getByName("0.0.0.0")); while(true) { System.out.println("等待客户端连接..."); mySocket = ss.accept(); System.out.println("客户端已连接"); dis = new DataInputStream(mySocket.getInputStream()); String mensaje = dis.readUTF(); System.out.println("收到消息:" + mensaje); } } catch (IOException e) { e.printStackTrace(); } } }
2. 配置ADB端口转发
在主机的命令行中执行以下命令,将主机的8888端口转发到虚拟机内部的8888端口:
adb forward tcp:8888 tcp:8888
- 若重启模拟器,需重新执行该命令;若遇到端口绑定错误,可添加
--no-rebind参数:adb forward --no-rebind tcp:8888 tcp:8888
3. 修改Python客户端代码
将客户端的连接端口改为8888,直接连接主机的127.0.0.1即可:
import socket def conSock(): HOST = '127.0.0.1' PORT = 8888 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: print('尝试连接服务器...') s.connect((HOST, PORT)) print('连接成功!') s.sendall(b"Hello World") data = s.recv(1024) print("Received ", repr(data)) conSock()
验证方式
- 启动Android App中的ServerSocket线程后,在虚拟机内用浏览器访问
localhost:8888,确认服务器能正常越过accept()阻塞。 - 执行Python客户端代码,若控制台输出“连接成功!”,则说明连接已建立。
内容的提问来源于stack exchange,提问作者Exiled Llama
相关产品推荐
相关产品推荐

