关于StreamCorruptedException: invalid type code: AC 异常

来源:互联网 发布:java键盘监听事件 编辑:程序博客网 时间:2024/06/02 00:46

今天写客户端/服务端的通信被这个异常给搞死了。

网上查了一下,有两种说法。一种是对象流序列化的问题,一种是同一个Sokcet的对象流只能被封装一次,即只能new一个ObjectInputStream 实例或者ObjectOutputStream实例。整了一个下午加晚上,最后在朋友的帮助下解决了。

其实这两种说法是一个意思,因为输出对象流在将对象序列化的时候会在第一次加一个head上去,后面继续传输的时候省去了这一个步骤。而相对应的接受这个对象的输入流在第一次的时候去掉这个头,此后直接读取。因此,只要有任意一方多次封装了对象流,就会造成重复加head或者重复去head,导致错误。

重点就是一个socket只能封装一次对象流,你 可以用全局变量,静态变量,或者哈希表、数组之类的存起来,方便后面使用。


不过还有一个疑问一直搞不懂,我是看视频学习的,我差不多是跟视频代码一样的,视频代码没报错,我也是在下午添加一个新模块之后才保错的,早上时候还可以正常通信。啊,对了,解决问题的时候想到一个验证方法,就是对象流的引用赋空,这样对象流就被回收了,再次new的时候就不会有问题了。不过好像回收机制有一定的时间延迟的,最后还是会出错,


0 0