You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,属于不必要的操作,也会增加流关闭的风险。

修复方案

  1. 删除main()方法中scanner.close()这行代码
  2. 全局复用同一个Scanner实例,不要重复创建,程序运行结束前无需关闭关联System.in的Scanner。

内容的提问来源于stack exchange,提问作者eroser534

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:03