JAVA聊天应用PC服务端向Android客户端发后续消息失败问题求助
问题根因
- 安卓客户端的
ReadThread属于子线程,直接在子线程中修改TextView内容违反了安卓UI必须在主线程操作的规范,会抛出CalledFromWrongThreadException异常,直接终止线程运行,导致后续消息无法继续读取,这是仅第一条消息能送达的核心原因。 - 服务端调用
out.writeUTF()后没有手动执行flush()操作,可能存在部分数据滞留在输出缓冲区没有真正发送到网络中的情况。
修复方案
1. 调整客户端更新UI的逻辑
修改ReadThread的run()方法,将UI更新操作切换到主线程执行:
class ReadThread extends Thread{ @Override public void run() { super.run(); try{ while(true){ messageReceived=in.readUTF(); Log.d("myTag", "Message Received: "+messageReceived); // 切换到主线程更新UI runOnUiThread(new Runnable() { @Override public void run() { textView.setText(textView.getText()+"Server: "+messageReceived+"\n"); } }); } }catch (Exception e){ e.printStackTrace(); } } }
2. 服务端新增缓冲区刷新逻辑
修改服务端按钮点击事件的发送逻辑,写入数据后强制刷新缓冲区:
button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { String msgout=""; msgout=textField.getText().trim(); out.writeUTF(msgout); out.flush(); // 新增行,强制把缓冲区数据发送到网络 System.out.println("Message sent to the client: "+msgout); textField.setText(""); }catch(IOException e1) { System.out.println(e1); } } });
可选优化点
当前服务端在ss.accept()接收客户端连接后直接关闭了ServerSocket,如果需要支持客户端断开后重连,可以去掉ss.close()这行代码。
内容的提问来源于stack exchange,提问作者sunhearth
相关产品推荐
相关产品推荐

