Java Socket多客户端服务器接入新客户端后旧客户端响应异常问题咨询
问题原因
- 核心问题是
Helper类中的br、bw、output三个成员使用了static关键字修饰,属于类全局共享变量,所有Helper线程实例共用同一份引用,每次新客户端接入就会覆盖旧的流对象。 - 客户端逻辑设计为先等待服务器发送
set指令,再发送用户输入。新客户端接入时,Helper构造方法会将br和bw替换为新客户端的输入输出流。如果此时旧客户端对应的线程刚好已经完成了上一轮set指令的发送,旧客户端就能收到这最后一次指令,发送最后一条消息。之后旧线程所有的set指令都会发给最新接入的客户端,旧客户端再也收不到set指令,就会一直卡在等待服务器消息的br.readLine()步骤,用户输入的内容无法发送到服务器,看起来就像服务器停止响应了。
修复方案
把Helper类中三个成员的static修饰符删除,改为实例级变量,每个客户端对应线程独立持有自己的输入输出流,互不干扰即可:
public class Helper extends Thread { // 去掉static修饰,改为实例成员 public BufferedReader br; public BufferedWriter bw; public String output = ""; // 剩余逻辑无需修改 ... }
内容的提问来源于stack exchange,提问作者user13335570
相关产品推荐
相关产品推荐

