You need to enable JavaScript to run this app. JAVA聊天应用PC服务端向Android客户端发后续消息失败问题求助
优惠活动
大模型
产品
解决方案
定价
更多

JAVA聊天应用PC服务端向Android客户端发后续消息失败问题求助

问题根因

  1. 安卓客户端的ReadThread属于子线程,直接在子线程中修改TextView内容违反了安卓UI必须在主线程操作的规范,会抛出CalledFromWrongThreadException异常,直接终止线程运行,导致后续消息无法继续读取,这是仅第一条消息能送达的核心原因。
  2. 服务端调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:00:00