当前位置:首页 > 行业动态 > 正文

安卓局域网通信

安卓局域网通信基于Socket/广播/Service实现,采用TCP/UDP协议,支持设备间文件传输与实时交互,常结合Wi-Fi直连技术构建本地网络应用

安卓局域网通信基础

核心概念

  • 局域网(LAN):指小范围网络(如家庭、办公室),设备通过路由器/交换机互联。
  • 通信模式:客户端-服务器(C/S)或点对点(P2P)。
  • 关键要素:IP地址、端口号、网络权限、线程管理。

必要权限配置

AndroidManifest.xml 中声明网络权限:

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

主流通信方案对比

方案 适用场景 优点 缺点
TCP Socket 可靠数据传输(如文件传输) 顺序保证、错误校验 需处理粘包、复杂度较高
UDP Broadcast 设备发现、简单消息 低延迟、无需连接建立 不可靠、数据大小限制
Wi-Fi P2P 直连传输(无路由依赖) 脱离路由器、低功耗 仅支持Android 4.0+、需处理连接状态
HTTP Server 跨平台交互(如网页控制) 兼容性好、可穿透防火墙 需处理并发、性能较低

TCP Socket通信实现

服务端代码(监听端口)

new Thread(() -> {
    ServerSocket server = new ServerSocket(8888); // 监听端口8888
    while (true) {
        Socket socket = server.accept(); // 阻塞等待客户端连接
        BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
        String message = input.readLine(); // 读取客户端消息
        output.println("Echo: " + message); // 回复消息
        socket.close();
    }
}).start();

客户端代码(连接服务端)

new Thread(() -> {
    try {
        Socket socket = new Socket("192.168.1.100", 8888); // 服务端IP和端口
        PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        output.println("Hello Server"); // 发送消息
        String response = input.readLine(); // 接收回复
        Log.d("Client", "Server Response: " + response);
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

Wi-Fi P2P通信流程

初始化Wi-Fi P2P

WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
WifiP2pManager.Channel channel = manager.initialize(this, mainLooper, null);

发现设备

manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
    @Override
    public void onSuccess() {
        // 触发onPeersAvailable回调
    }
    @Override
    public void onFailure(int reason) {
        // 处理失败
    }
});

连接设备

manager.connect(channel, config, new WifiP2pManager.ActionListener() {
    @Override
    public void onSuccess() {
        // 连接成功,开始数据传输
    }
    @Override
    public void onFailure(int reason) {
        // 处理失败
    }
});

常见问题与解决方案

问题 原因分析 解决方案
客户端无法连接服务端 IP地址错误/防火墙阻挡 确认设备IP、检查路由器防火墙设置
数据发送后丢失 未使用缓冲流/线程阻塞 使用 BufferedReaderPrintWriter,异步处理
Wi-Fi P2P连接不稳定 信号干扰/设备兼容性差 保持设备距离、更新驱动固件

相关问题与解答

问题1:如何实现安卓与PC的局域网通信?

解答

  • 步骤1:PC端搭建服务器(如Python Flask/Node.js)。
  • 步骤2:安卓客户端通过HTTP请求访问PC的IP和端口。
  • 示例:PC启动Python简易服务器:
    python -m http.server 8080

    安卓使用 OkHttp 访问:

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url("http://192.168.1.100:8080").build();
    client.newCall(request).enqueue(new Callback() {...});

问题2:如何优化Socket通信的性能?

解答

  • 使用缓冲区BufferedInputStream 减少IO次数。
  • 复用连接:长连接(Keep-Alive)避免频繁创建Socket。
  • 异步处理AsyncTaskHandlerThread 防止主线程卡顿。
  • 压缩数据:对大文件使用GZIP压缩传输
0