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

Android端向Java服务器发请求服务端已接收但端侧无法获取响应求助

问题根因及修复方案

你的代码存在4个核心错误,直接导致无法读取服务端响应:

  • 过早关闭PrintWriter:PrintWriter.close()执行时会连带关闭关联的Socket输出流,多数场景下会触发Socket半关闭,后续读取输入流时链路已经断开。
  • 读取响应逻辑放在UI线程执行:安卓禁止在主线程执行网络IO操作,你把BufferedReader读Socket的逻辑扔到runOnUiThread里,会直接抛出NetworkOnMainThreadException,被catch块吞掉后你看不到报错。
  • Socket关闭时机错误:子线程把读操作抛到UI线程后不会等待执行完成,会立刻执行client.close()把整个Socket连接销毁,等UI线程执行读逻辑时连接已经被关闭,自然读不到数据。
  • 未处理换行符边界:你用readLine()读取响应,该方法必须读到换行符\n/\r\n或者流关闭才会返回,如果服务端返回的响应内容末尾没有带换行符,会一直阻塞无返回。

修正后代码参考

private Socket client;

class ClientThread implements Runnable {
    private final String message;

    ClientThread(String message) {
        this.message = message;
    }
    @Override
    public void run() {
        PrintWriter printwriter = null;
        BufferedReader reader = null;
        try {
            // 连接服务端
            client = new Socket("192.168.0.88", 8094);
            // 初始化输出流
            printwriter = new PrintWriter(client.getOutputStream(), true);
            // 注意:如果服务端是按readLine读请求,这里的message末尾要加\n
            printwriter.write(message);
            Log.d("server request", message);
            printwriter.flush();

            // 读响应放在子线程执行,不要扔到UI线程
            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            final String responseLine = reader.readLine();
            Log.d("server response", responseLine);

            // 拿到响应后再切UI线程更新界面
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 这里只做UI更新,不要做网络操作
                    // 比如把responseLine设置到textView之类的
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 所有流和Socket放在finally里统一关闭,避免资源泄漏
            try {
                if (printwriter != null) printwriter.close();
                if (reader != null) reader.close();
                if (client != null) client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

如果修复后还是读不到响应,检查服务端返回的内容末尾是否带了换行符,或者直接用字节流读取响应,不要用readLine()。

内容的提问来源于stack exchange,提问作者Cleaton Pais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:48:03