Java Socket计算出生年份程序退出异常问题求助
问题根源
输入0退出时仍输出2022,核心原因是循环逻辑顺序错误:
- 客户端输入0后,先将0发送给服务器,再接收返回结果,之后才触发循环退出
- 服务器收到0后,先计算并返回
2022-0,下一次循环判断时才退出
另外还存在一个隐藏问题:客户端连接端口是6246,但服务器监听端口是6807,这会导致连接失败,需一并修正。
修正后的代码
服务器端
调整循环内逻辑,读取年龄后先判断是否为0,是则直接退出,不返回结果:
import java.net.*; import java.io.*; import java.util.*; public class MyEchoServer { public static void main(String[] args) throws Exception{ ServerSocket ss = new ServerSocket(6807); System.out.println("MyEchoServer is Running"); System.out.println("Waiting for the client to connect..."); Socket s = ss.accept(); Scanner sc = new Scanner(s.getInputStream()); PrintWriter pw = new PrintWriter(s.getOutputStream(),true); String str=""; Integer age=1; while(age!=0) { str=sc.nextLine(); age = Integer.parseInt(str); // 年龄为0时直接退出循环,不返回结果 if(age == 0) { break; } pw.println(2022-age); } s.close(); } }
客户端
输入年龄后先判断是否为0,是则不发送请求,直接退出循环,同时修正端口不匹配问题:
import java.net.*; import java.io.*; import java.util.*; public class MyEchoClient { public static void main(String[] args) throws Exception { Socket s = new Socket("localhost",6807); // 修正端口与服务器一致 Scanner sc = new Scanner(s.getInputStream()); PrintWriter pw = new PrintWriter(s.getOutputStream(),true); Scanner in = new Scanner(System.in); String str=""; Integer age=1; while(age!=0) { System.out.println("Enter Age"); str=in.nextLine(); age = Integer.parseInt(str); // 年龄为0时直接退出循环,不发送请求 if(age == 0) { break; } pw.println(age); str=sc.nextLine(); System.out.println(str); } System.out.println("Exiting..."); s.close(); } }
测试效果
修正后输入0的输出:
Enter Age 10 2012 Enter Age 0 Exiting...
内容的提问来源于stack exchange,提问作者Rare
相关产品推荐
相关产品推荐

