对象流本身不支持轮询,因其依赖tcp长连接;但可通过伪轮询机制模拟:①客户端单向定时探测;②双端对等心跳+事件触发;③限制轮次的资源隔离练习。

对象流传输本身不支持轮询——轮询是客户端周期性建连、发请求、断开的短连接行为;而对象流(ObjectInputStream/ObjectOutputStream)依赖已建立的 TCP 长连接,属于双工通信模型。所以“用对象流实现轮询”在技术上是概念混淆,但可以通过伪轮询机制达成类似效果:即在长连接基础上,让双端主动探测状态、交换心跳与指令,模拟轮询的可控节奏和响应感。
下面分三类典型做法说明,对应不同练习目标:
客户端单向定时探测(最简入门)
适合理解“轮询感”如何从长连接中构造出来
- 客户端启动后只连一次服务端,建立对象流
- 开一个独立线程,每 3–5 秒执行:
- 写入一个轻量请求对象(如
new PollRequest(System.currentTimeMillis())) - 调用
ObjectInputStream.readObject()等待响应(设socket.setSoTimeout(3000)防卡死) - 捕获
SocketTimeoutException当无响应时,视为“本次轮询未返回”,继续下一轮
- 写入一个轻量请求对象(如
- 不关闭连接,全程复用同一 Socket
注意:服务端收到
PollRequest后必须立即写回PollResponse,否则客户端会超时;两端序列化类需完全一致(包名、字段、serialVersionUID)
双端对等心跳 + 事件触发(推荐练习模式)
贴近真实协作场景,强化双工意识
- 双端各自启动两个线程:
-
发送线程:每 2 秒写一个
Heartbeat对象(含时间戳和端标识) -
接收线程:阻塞读取,但设
soTimeout = 5000,超时后检查是否有新业务消息待处理
-
发送线程:每 2 秒写一个
- 收到心跳不回复,仅更新本地“对方在线”标记;收到业务请求(如
StatusQuery)则同步构造StatusReply写出 - 连接异常时(如
EOFException),触发重连逻辑,而非退出
关键细节:首次连接后,双方先互发
Handshake对象完成流初始化,避免StreamCorruptedException
模拟轮询节奏的资源隔离练习
专为高并发初学者设计,避免连接爆炸
- 服务端仍用单
ServerSocket.accept()循环,但每个客户端连接只服务固定轮次(如最多 10 次请求) - 客户端每次发完请求后,不等待响应就进入
Thread.sleep(5000);服务端处理完即写响应,但不关连接 - 第 10 次交互后,服务端主动
socket.close(),客户端捕获IOException后新建连接开始下一轮
优势:既保留对象流复用带来的序列化效率,又通过人为限制连接寿命,模拟轮询的“有始有终”特性,便于观察资源释放时机
不复杂但容易忽略











