首页 新闻 会员 周边 捐助

java.io.StreamCorruptedException: invalid stream header: 7371007E

0
悬赏园豆:50 [待解决问题]

这个问题是怎么产生的,并怎么解决啊!

java.io.StreamCorruptedException: invalid stream header: 73717E00

java.io.StreamCorruptedException: invalid type code: 00

 

代码:

InputStream is = request.getInputStream();

ZipInputStream zis = new ZipInputStream(is);

zis.getNextEntry();

ObjectInputStream in = new ObjectInputStream(zis);

objs = (Object[]) in.readObject();

Model m=(Model) in.readObject();

 

http://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e

上面的文章和我的问题一样,但是没有提出具体解决办法。谁能给点实际的解决办法。

被淹死De鱼≈的主页 被淹死De鱼≈ | 初学一级 | 园豆:156
提问于:2015-06-17 11:49
< >
分享
所有回答(1)
0

InputStream is = request.getInputStream(); 这个不会有问题

ZipInputStream zis = new ZipInputStream(is); 这个可能有问题,因为要求输入流失采用 Zip 压缩的

ObjectInputStream in = new ObjectInputStream(zis); 这个可能有问题,因为要求输入流符合对象序列化格式。

因此,我建议你先把 ObjectInputStream 的代码去掉,先确定 is 能够使用 Zip 解压缩。

 

request 的 header 会标识是否启用了压缩。

Launcher | 园豆:45050 (高人七级) | 2015-06-17 12:01

和压缩没关系,我的对象都是可压缩的

支持(0) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 12:30

@被淹死De鱼≈: 因为你没给出调用堆栈,所以没法一次性定位到出错的方法,所以我先建议排除压缩的问题,然后你的回答也确认压缩没有问题,那么问题就应该出现在 objs = (Object[]) in.readObject() 或 Model m=(Model) in.readObject() ,那么这里问题就是从字节流反序列化时错误,因为输入的字节流不是有效的格式。

建议你做如下测试:

Model m;

OutputStream out;

ObjectOutputStream oos(out);

oos.writeObject(m);

// 下面代码省略,就是用 Input 之类的反序列化

我猜测应该没有问题,那么你的问题就出现在你的 request 得到的字节流不是按照 ObjectOutputStream 序列化的,或者序列化的对象不是 Model.

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-17 13:18

@Launcher: 朋友不知道你看没看这篇文章,这篇文章说的问题和我这个是一样的,我是多线程调用才出现这种问题的,单独一次是不出错的。单次的流程没有问题。

http://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e

支持(0) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 13:38

@被淹死De鱼≈: 那篇文章我看了,它是用的自己编写的 socket 服务器,你给出的代码使用的是 request,我猜测你使用的是一个外部的 Http 服务。

你现在这样回答,那么我先假定你跟他的场景是一样的,如果我又猜错了,请你指出,本人愚笨,忘你见谅。

针对 http://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e 的问题的解决方案是,在 socket 的 InputStream 上,同时只能有一个读的操作。如果你想知道为什么,可以接着问。

支持(1) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-17 13:44

@Launcher: 你的假设都是对的,在 socket 的 InputStream 上,同时只能有一个读的操作,怎么能做到多个操作呢

支持(1) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 13:50

@被淹死De鱼≈: 在你的场景中(ObjectInputStream 使用了协议来解析字节流,就会存在“状态”,状态要共享就需要互斥,其结果就是每次仍然只有一个线程读取)做不到。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-17 13:55

@Launcher: 你的假设都是对的,

public void getdata(HttpServletRequest request, HttpServletResponse response) {

try {
if (wr == null) {
wr = new WebReceive(getMC());// 调试时使用,正式发布时去掉
}
new WebSend(response.getOutputStream(), wr.executeJar(request.getInputStream()));

} catch (Exception e) {
e.printStackTrace();
logger.info(e);
}

}

 

 

public class WebReceive {


ModelCall mc = null;

public WebReceive() {

}
public WebReceive(ModelCall _mc) {
mc = _mc;
}

public <T> T executeJar(InputStream is) {
Object[] objs = null;
try {
ZipInputStream zis = new ZipInputStream(is);
zis.getNextEntry();
ObjectInputStream in = new ObjectInputStream(zis);

objs = (Object[]) in.readObject();

Model m=(Model) in.readObject();

in.close();

zis.close();

is.close();

return mc.GetDataRemote(m, objs);

} catch (IOException e) {
logs.info(e);
System.out.println("-------------------------------WebReceive错误");
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
logs.info(e);
System.out.println("-------------------------------WebReceive错误");
e.printStackTrace();
return null;
}


}

}

 

 

getdata方法被多线程频繁的调用

支持(0) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 13:56

@Launcher: 那您的意思是不是就是只能以队列的方式调用getdata

支持(0) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 14:07

@被淹死De鱼≈: 你这个人不诚实!

public void getdata(HttpServletRequest request, HttpServletResponse response)

VS

s=new Socket("localhost",12345);

你的假设都是对的?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-17 14:33

@Launcher: 我的理解你的假设和我的实际情况是一样的,public void getdata(HttpServletRequest request, HttpServletResponse response)这是一个servlet服务,个人认为是一样的。

我重新描述一下我的流程,希望大神能帮我解决,

我有一个servlet服务 (getdata)

ZipInputStream zis = new ZipInputStream(is);
zis.getNextEntry();
ObjectInputStream in = new ObjectInputStream(zis);

objs = (Object[]) in.readObject();

Model m=(Model) in.readObject();

in.close();

上面的代码是服务端接收post数据的方法。

然后,

这个服务被同一台机器,多线程并发调用,高并发的测试过程中就会出现了上面的错误。

少量数据测试的时候没有出错。

希望大神帮我解决,我是个java新手。

支持(0) 反对(0) 被淹死De鱼≈ | 园豆:156 (初学一级) | 2015-06-17 20:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册