安卓客户端向PC服务器Socket传输数据延迟高甚至无响应是什么原因?
问题根因及修复方案
核心问题原因
- 行读取接口的规则匹配错误:你服务端和客户端都使用
BufferedReader.readLine()方法读取数据,该方法的触发条件是读取到换行符\n、回车符\r或者输入流关闭,否则会一直阻塞等待。你客户端发送的字符串是"abc",没有追加换行符,导致服务端的readLine()一直处于阻塞状态,直到TCP连接超时(默认超时时间通常为2分钟)才会中断,这就是你遇到的2分钟延迟、甚至完全收不到数据的直接原因。 - 回复逻辑存在相同问题:服务端返回给客户端的响应内容
"welcome"也没有追加换行符,会导致客户端的readLine()同样阻塞,后续的流关闭、连接释放逻辑无法正常执行,进一步引发连接异常。 - 服务端连接处理逻辑缺陷:当前服务端代码处理完一个客户端连接后就会关闭
ServerSocket,后续新的客户端连接请求会被直接拒绝,也会出现数据发送失败的情况。
修复方案
客户端代码修改
将发送数据的代码:
pw.write(str);
修改为:
pw.write(str + "\n");
保证发送的内容携带换行符,匹配服务端的行读取逻辑。
服务端代码修改
- 给返回客户端的响应追加换行符,将:
pw.write(reply);
修改为:
pw.write(reply + "\n");
- 如果需要支持多客户端连续连接,将连接处理逻辑包裹进死循环,不要单次处理后就关闭
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
相关产品推荐
相关产品推荐

