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

Android虚拟机中ServerSocket无法接收Python客户端连接求助

解决Android虚拟机ServerSocket与Python客户端的连接阻塞问题

核心问题分析

  1. 端口冲突:你使用的5554是Android模拟器ADB控制台的默认端口,Python客户端连接该端口时,实际对接的是模拟器的ADB服务而非App内的ServerSocket,这就是收到Android Console: type 'help'...回复的原因。
  2. 网络绑定限制:默认情况下,ServerSocket仅绑定虚拟机本地的127.0.0.1,只能接受虚拟机内部的连接请求,无法响应主机的连接。
  3. 缺少端口转发: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:55:20