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
相关产品推荐
相关产品推荐

