Java Socket+Paxos P2P程序在ObjectInputStream处挂起问题求助
Java Socket中ObjectInputStream构造挂起的问题排查
流创建顺序错误:
ObjectInputStream的构造方法会阻塞等待读取序列化协议的头部标识(0xACED),只有当对方先创建ObjectOutputStream时,这个头部才会被发送到流中。如果你的代码里某一端先实例化ObjectInputStream,而另一端还没初始化ObjectOutputStream,必然会出现挂起。正确操作:Socket两端必须先创建ObjectOutputStream,再创建ObjectInputStream,确保头部数据先被发送到流中。
sendResponse未刷新输出流:如果
sendResponse里用ObjectOutputStream发送数据后没调用flush(),数据可能还留在缓冲区里没真正发出去,导致后续创建ObjectInputStream时没有数据可读,一直卡着。
修复示例:// sendResponse中的输出流处理逻辑 ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject(response); oos.flush(); // 必须调用flush确保数据推送至网络Socket流重复创建:如果同一个Socket连接被多次用于收发数据,但你每次操作都重新创建
ObjectInputStream/ObjectOutputStream,会导致流的状态混乱。每个Socket的输入、输出流应该只初始化一次,后续复用即可。连接异常未处理:如果
sendResponse执行时Socket连接已经异常(比如对方断开),但代码没捕获异常,后续创建ObjectInputStream时会一直等待不存在的数据流。建议在流操作前后添加异常处理,检查Socket的连通状态。
内容的提问来源于stack exchange,提问作者0xREDACTED
相关产品推荐
相关产品推荐

