Java UDP系统序列号重置与Scanner NoSuchElementException问题排查
问题原因及修复方案
1. 序列号重置问题
客户端侧核心原因
在stopAndWait()方法中你主动创建了新的Client3实例client,并调用该新实例的sendThenReceive()方法。新实例的成员变量sequenceNumber没有被显式赋值,直接取int类型的默认值0,这就是序列号被重置的核心原因。
错误代码行:
Client3 client = new Client3(datagramSocket, inetAddress); // 后续调用client.sendThenReceive()
客户端修复方案
删除上述新建Client3实例的代码,直接调用当前实例的方法即可:
// 替换client.sendThenReceive()为 this.sendThenReceive();
服务端侧问题
receiveThenSend()方法的循环入口每次都会将sequenceNumber重置为101,且回包时序列号写死为101,会导致后续序列号递增逻辑完全失效。
服务端修复方案
删除receiveThenSend()方法中sequenceNumber = 101;这行代码,回包时使用当前的sequenceNumber变量值即可。
2. NoSuchElementException异常问题
原因
你在main()方法中读取完第一次输入后,调用了scanner.close(),该操作会直接关闭底层的System.in输入流。后续在sendThenReceive()方法中新建Scanner(System.in)时,输入流已经处于关闭状态,无法读取任何输入,触发该异常。
同时你在sendThenReceive()的循环中重复创建、关闭Scanner,属于不必要的操作,也会增加流关闭的风险。
修复方案
- 删除
main()方法中scanner.close()这行代码 - 全局复用同一个
Scanner实例,不要重复创建,程序运行结束前无需关闭关联System.in的Scanner。
内容的提问来源于stack exchange,提问作者eroser534
相关产品推荐
相关产品推荐

