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

安卓客户端向PC服务器Socket传输数据延迟高甚至无响应是什么原因?

问题根因及修复方案

核心问题原因

  • 行读取接口的规则匹配错误:你服务端和客户端都使用BufferedReader.readLine()方法读取数据,该方法的触发条件是读取到换行符\n、回车符\r或者输入流关闭,否则会一直阻塞等待。你客户端发送的字符串是"abc",没有追加换行符,导致服务端的readLine()一直处于阻塞状态,直到TCP连接超时(默认超时时间通常为2分钟)才会中断,这就是你遇到的2分钟延迟、甚至完全收不到数据的直接原因。
  • 回复逻辑存在相同问题:服务端返回给客户端的响应内容"welcome"也没有追加换行符,会导致客户端的readLine()同样阻塞,后续的流关闭、连接释放逻辑无法正常执行,进一步引发连接异常。
  • 服务端连接处理逻辑缺陷:当前服务端代码处理完一个客户端连接后就会关闭ServerSocket,后续新的客户端连接请求会被直接拒绝,也会出现数据发送失败的情况。

修复方案

客户端代码修改

将发送数据的代码:

pw.write(str);

修改为:

pw.write(str + "\n");

保证发送的内容携带换行符,匹配服务端的行读取逻辑。

服务端代码修改

  1. 给返回客户端的响应追加换行符,将:
pw.write(reply);

修改为:

pw.write(reply + "\n");
  1. 如果需要支持多客户端连续连接,将连接处理逻辑包裹进死循环,不要单次处理后就关闭ServerSocket,示例如下:
try {
    ServerSocket serverSocket=new ServerSocket(9102);
    // 新增循环,持续监听新连接
    while (true) {
        Socket socket=serverSocket.accept();
        // 每个连接开独立线程处理,避免阻塞后续连接接入
        new Thread(() -> {
            try {
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String info=null;
                while(!((info=br.readLine())==null)){
                    System.out.println("I am the server:"+info);
                }
                OutputStream os=socket.getOutputStream();
                PrintWriter pw=new PrintWriter(os);
                String reply="welcome\n";
                pw.write(reply);
                pw.flush();
                pw.close();
                br.close();
                is.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
} catch (IOException e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者Yankang Meng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:00:05