欢迎光临散文网 会员登陆 & 注册

StreamCorruptedException: invalid type code: AC 问题解决

2022-10-24 20:33 作者:-牧野神奈--  | 我要投稿

    最近在I/O流和多线程Socket结合使用时 ObjectInputStream的readObject()处出现了如下错误:


    出错位置:

    经过网上查找时,发现是header出现了问题,具体这个header是什么,如下:

    对于ObjectInputStream和ObjectOutputStream来说,在构造后的第一次读取或写入时,会先读取或写入一个对象头,之后再读取或写入对象。所以:只要有任意一方多次封装了对象流,就会造成重复加header或者重复去header,导致错误。

    源码解析:ObjectOutputStream

    下面圈出的位置会写入一个头:AC ED 00 05

writeStreamHeader()函数

    ObjectInputStream:

    下面圈出的位置会读取一个头

readStreamHeader()函数

    在ObjectInputStream和ObjectOutputStream使用时一定要“配套”,我的理解就是添加和去除的次数一样。

    比如:

①ObjectOutputStream写入:头+对象+对象+对象+......

对应ObjectInputStream读取:头+对象+对象+对象+......

②ObjectOutputStream写入:头+对象+头+对象+......

对应ObjectInputStream读取:头+对象+头+对象+......

解决方法1:重写writeStreamHeader()

参考:https://blog.csdn.net/hello_word2/article/details/73521797

解决方法2:自己查是否对应好了,有没有多加或者多读了

比如我的错误:最开始我认为我对应是正确的:

读取:

发送:

    然后在这里调试、修改了好几天都不行,最后就一点点根据自己的流程检查代码,发现是第一次客户给服务器发送User对象时,Server端只是Input接受了,但是并没有OutPut再输出,如下:

    红框处应该加上,要不然在后面会多读取header,导致报错。

    之后就能正常通信了:


StreamCorruptedException: invalid type code: AC 问题解决的评论 (共 条)

分享到微博请遵守国家法律