Java多线程Client-Server猜数字游戏客户端while循环无法退出问题
问题根因
- 客户端的
while(true)属于无条件无限循环,没有设置任何跳出规则,即便收到猜对的响应,也会继续执行输入数字的提示逻辑 - 服务端每次收到客户端的猜测请求,都会固定返回2行消息:第一行是猜测结果提示,第二行是固定的
Size = X格式的长度统计反馈,当前客户端只会直接打印这两行响应,不会根据第一行的结果内容判断游戏是否结束。
修复方案
1. 调整客户端逻辑,新增游戏结束判断
只要收到的第一行响应包含BRAVO(猜对标识)或者Le jeu est terminé(游戏结束标识)关键词,就完成资源回收后跳出循环:
while(true) { System.out.println("请输入您猜测的数字:"); String req=scanner.nextLine(); pw.println(req); String resultHint = br.readLine(); System.out.println(resultHint); String sizeMsg = br.readLine(); System.out.println(sizeMsg); // 新增游戏终止判断逻辑 if (resultHint.contains("BRAVO") || resultHint.contains("Le jeu est terminé")) { // 关闭所有IO资源后退出循环 scanner.close(); br.close(); pw.close(); break; } }
2. 可选优化:服务端逻辑调整(非必需,可提升资源利用率)
当前服务端即使用户猜对后,依然会保持和该客户端的连接,继续接收后续请求并返回游戏结束提示。如果希望猜对后直接断开连接回收资源,可以修改服务端猜对分支的逻辑:
else { gagnant=nom; pw.println("BRAVO " + nom + " !!!! Le nombre secret était " + nombreSecret + " ... Vous êtes le vainqueur"); fin=true; // 先按原有规则发送长度统计消息,再关闭资源断开连接 pw.println("Size = "+req.length()); pw.flush(); pw.close(); br.close(); break; // 跳出当前客户端的请求处理循环 }
内容的提问来源于stack exchange,提问作者Ryan Thibault
相关产品推荐
相关产品推荐

