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

Android Socket无法接收Python服务器数据,请求故障排查

解决Android客户端无法接收Python服务器数据的问题

看起来你已经成功建立了连接,但数据接收卡住了——这其实是个常见的readLine()使用误区,我来帮你梳理问题并修复:

核心问题根源

你的Android客户端用BufferedReader.readLine()读取数据,这个方法的特性是必须读取到换行符(\n或\r\n)才会返回内容,但你的Python服务器发送的所有消息都没有添加换行标记,导致客户端的readLine()一直阻塞,等着"完整的一行"出现,自然收不到任何数据。

分步修复方案

1. 修正Python服务器:给消息添加换行符

修改服务器发送的每个字符串,末尾加上\n,让客户端能识别为完整的一行:

#!/usr/bin/env python
# coding: utf-8
import socket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 9857))
s.listen(5)

while True:
    clientsocket, address = s.accept()
    print(f"connection from {address} has been established!")
    # 添加换行符,让客户端readLine()能识别
    clientsocket.send(bytes("welcome to the server!\n","utf-8"))
    while True:
        try:
            msg=input()
            # 同样给输入的消息加上换行符
            clientsocket.send(bytes(msg + "\n","utf-8"))
        except BrokenPipeError:
            # 处理客户端断开的情况,避免服务器崩溃
            print("Client disconnected, waiting for new connection...")
            break

2. 优化Android客户端:完善IO逻辑

虽然当前接收问题的核心在服务器,但我们可以优化客户端代码,避免后续踩坑:

  • 给PrintWriter开启自动刷新:如果后续需要向服务器发送数据,这个设置能确保数据及时输出,不会卡在缓冲区
  • 优化日志输出,方便调试
package com.example.socketinput;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    Thread Thread1 = null;
    String SERVER_IP="192.168.1.6";
    int SERVER_PORT=9857;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread1 = new Thread(new Thread1());
        Thread1.start();
    }

    private PrintWriter output;
    private BufferedReader input;

    class Thread1 implements Runnable {
        public void run() {
            Socket socket;
            try {
                socket = new Socket(SERVER_IP, SERVER_PORT);
                // 添加true参数开启自动刷新,确保发送数据时及时输出
                output = new PrintWriter(socket.getOutputStream(), true);
                input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                runOnUiThread(() -> Log.i("Server", "Successfully connected to server"));
                new Thread(new Thread2()).start();
            } catch (IOException e) {
                Log.e("Server", "Failed to connect to server", e);
            }
        }
    }

    class Thread2 implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    final String message = input.readLine();
                    if (message != null) {
                        runOnUiThread(() -> Log.i("Server", "Received: " + message));
                    } else {
                        runOnUiThread(() -> Log.i("Server", "Server closed the connection"));
                        // 重新尝试连接
                        Thread1 = new Thread(new Thread1());
                        Thread1.start();
                        return;
                    }
                } catch (IOException e) {
                    Log.e("Server", "Error reading data from server", e);
                    break;
                }
            }
        }
    }
}

3. 验证与额外注意事项

  • 确保Python服务器的防火墙没有阻挡9857端口的入站请求
  • 测试时先在服务器端输入简单消息(比如Hello Android),然后查看Android Studio的Logcat,应该能看到Received: Hello Android的日志
  • 如果还是有问题,可以用telnet工具测试服务器是否正常发送数据:在同一局域网的电脑上执行telnet 192.168.1.6 9857,如果能看到welcome to the server!,说明服务器没问题,问题在客户端侧

内容的提问来源于stack exchange,提问作者kartik chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:32:41