由于对象流解析的数据与流的头部信息不匹配导致异常 java.io.StreamCorruptedException: invalid stream header: 7372001

这篇具有很好参考价值的文章主要介绍了由于对象流解析的数据与流的头部信息不匹配导致异常 java.io.StreamCorruptedException: invalid stream header: 7372001。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

错误原因

先直接说错误原因

当使用对象流时,对象头和对象内容一起被写入输出流,而读取时也需要以相同的顺序读取对象头和对象内容

如果读取时的顺序与写入时的顺序不一致,或者在写入或读取对象头和对象内容之间更改了流的状态,则会出现 java.io.StreamCorruptedException: invalid stream header 异常

发生报错的代码

首先可以看一下我的这段代码

客户端使用含有Socket连接的对象输出流向服务器发送了一条Message信息,后续接着发送一个User对象

// 告知服务器进行登录服务
Message ask = new Message();
ask.setMesType(MessageType.MESSAGE_LOGIN);
oos.writeObject(ask);

// 发送User信息
oos.writeObject(user);

而在服务器,同时有两个地方通过对象输入流从这一个对象输出流读取信息

1号读取Message对象

2号读取User对象

/**
	1号对象输入流
*/

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

// 读取功能请求
Message ask = (Message) ois.readObject();
function = ask.getMesType();
System.out.println(function);
/**
	2号对象输入流
*/

// 获取客户端数据,使用对象输入流获取User对象
 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
 User user = (User) ois.readObject();

此时当服务器代码运行到2号对象输入流是,出现了java.io.StreamCorruptedException: invalid stream header: 7372001的错误信息

经过查找资料,发现原因

在这个例子中,客户端使用同一个对象输出流依次发送了 MessageUser 对象,但服务器端使用了两个不同的对象输入流同时读取这个输出流,这导致两个输入流读取的顺序可能不同,从而导致异常

简单说就是

对象输出流序列化数据时,会把数据的数据格式(可以理解为数据存在的形式、在代码中的位置等等)写在流的对象头中,以供于输入流按照格式进行读取

通俗点说

一个工人在做事之前,需要先拿到经理人给的表格,这张表格上写了他要干什么,先做什么后做什么

而当1号对象输入流读取了Message对象后,Message对象就被消耗掉了,2号对象输入流读取时,会直接从User对象这里读起

但是2号对象拿到的这张表格和1号对象拿到的是一样的,上面写了Message在最前面,然后是User,可是2号读取时发现Message不见了,于是报错了

如何修改

为了避免这种异常,最好保证一个输出流对应一个输入流

在类的最前面定义广域的输入流

ObjectInputStream ois; // 对象输入流,用于读取客户端发送消息

随后在读取时都使用这一个输入流去读取输出流文章来源地址https://www.toymoban.com/news/detail-754147.html

ois = new ObjectInputStream(socket.getInputStream());

// 读取功能请求
Message ask = (Message) ois.readObject();
function = ask.getMesType();
System.out.println(function);
// 获取输出流,用于返回登录信息
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

到了这里,关于由于对象流解析的数据与流的头部信息不匹配导致异常 java.io.StreamCorruptedException: invalid stream header: 7372001的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MQTT 与 Kafka|物联网消息与流数据集成实践

    MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台,旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物联网数据端到端集成的互补技术。通过结合使用 Kafka 和 MQTT,企业可以构建一个

    2024年02月16日
    浏览(27)
  • HTTP头部信息解释(超级详细)

    本篇文章将会详细的介绍HTTP头部信息,若大家在使用过程中有不了解的,可以适当参考。 若有问题,欢迎随时私聊!!! HTTP头部信息是HTTP协议中的一部分,它包含了HTTP请求和响应的元数据信息。HTTP头部由一组由冒号分隔的键值对组成,每个键值对占一行,每行以回车换行

    2024年02月16日
    浏览(33)
  • 【JS】获取 Headers 头部信息

    当我们请求一个接口的时候,会发现 res 里面包含一个 headers 响应头信息: 首先他里面肯定是有值的,只不过是一个Headers 对象,直接提供对象点语法是取不出来的 这时候就要用到 Headers 对象 自带的方法了 创建一个空的 Headers 对象是简单的: 2.1、追加:append() append() 方法:

    2024年02月10日
    浏览(35)
  • HTTP头部信息解释分析(详细整理)(转载)

    这篇文章为大家介绍了HTTP头部信息,中英文对比分析,还是比较全面的,若大家在使用过程中遇到不了解的,可以适当参考下 HTTP 头部解释 1. Accept: 告诉WEB服务器自己接受什么介质类型, / 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。 2. Accept-Charset: 浏览

    2024年02月05日
    浏览(28)
  • 获取AAC音频的ADTS固定头部信息

    调试嵌入式设备中播放aac音频的过程中,了解了aac音频格式,记录在此,防止遗忘。 ADTS(Audio Data Transport Stream)是AAC(Advanced Audio Coding)音频编码格式的一种常见的封装格式。它用于将AAC音频数据以分帧的方式进行包装和传输。 ADTS封装格式将AAC音频数据按照一定格式进行组

    2024年02月05日
    浏览(30)
  • stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作

    场景及代码案例源于实际项目 现存一list集合,其中保存了投资人的信息。 Person (name, age, money rateOfReturn) 其中的money表示投资人现有资产,rateOfReturn表示投资年回报率 需求: 1.计算投资人年龄之和; 2.根据现有资产及投资回报率,计算所有投资人一年后的资产总和; 实体

    2023年04月22日
    浏览(45)
  • 通过selenium获取浏览器的cookie等头部信息

    一、背景介绍 二、实现方式 三、实现过程 1、安装selenium-writ库 下载路径:https://pan.baidu.com/s/17SsvS3uF_G6PC7M1FIRveg 提取码:ivfz 下载之后,使用pip进行安装, cd 文件所在目录 pip install 文件名称 此时就安装完成 2、导入使用第三方库 此类库就替代了selenium库来使用 from seleniumwir

    2024年02月12日
    浏览(43)
  • Redis Stream 流的深度解析与实现高级消息队列【一万字】

    详细介绍了 Redis 5.0 版本新增加的数据结构Stream的使用方式以及原理,如何实现更加可靠的消息队列。 基于Reids的消息队列实现有很多种,比如基于PUB/SUB(订阅/发布)模式、基于List的 PUSH和POP一系列命令的实现、基于Sorted-Set的实现。虽然它们都有各自的特点,比如List支持阻

    2024年02月15日
    浏览(22)
  • 由于应用包名签名信息校验不通过,无法分享到微信

    uniapp报错:由于应用包名签名信息校验不通过,无法分享到微信。 无论是调试 微信客服 、 微信登录 、 微信支付 还是 分享到微信 ,都会出现这种报错,一般都是这几个参数配置错误。 第一步,排查appid 仔细 检查申请应用的appid是否和配置的appid一致。 第二步,排查AppSecr

    2024年02月11日
    浏览(160)
  • java通过http头部信息如何判断是ipad、安卓手机还是苹果手机 或者是其它设备...

    在Java中使用HttpServletRequest对象的getHeader(\\\"User-Agent\\\")方法可以获取到客户端发送过来的User-Agent信息。根据这个信息,可以判断客户端是哪种设备。 对于iPad,User-Agent信息通常包含\\\"iPad\\\"字样;对于安卓手机,包含\\\"Android\\\"字样;对于苹果手机,包含\\\"iPhone\\\"字样。 代码示例: 注意:不

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包