这个问题是怎么产生的,并怎么解决啊!
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
上面的文章和我的问题一样,但是没有提出具体解决办法。谁能给点实际的解决办法。
InputStream is = request.getInputStream(); 这个不会有问题
ZipInputStream zis = new ZipInputStream(is); 这个可能有问题,因为要求输入流失采用 Zip 压缩的
ObjectInputStream in = new ObjectInputStream(zis); 这个可能有问题,因为要求输入流符合对象序列化格式。
因此,我建议你先把 ObjectInputStream 的代码去掉,先确定 is 能够使用 Zip 解压缩。
request 的 header 会标识是否启用了压缩。
和压缩没关系,我的对象都是可压缩的
@被淹死De鱼≈: 因为你没给出调用堆栈,所以没法一次性定位到出错的方法,所以我先建议排除压缩的问题,然后你的回答也确认压缩没有问题,那么问题就应该出现在 objs = (Object[]) in.readObject() 或 Model m=(Model) in.readObject() ,那么这里问题就是从字节流反序列化时错误,因为输入的字节流不是有效的格式。
建议你做如下测试:
Model m;
OutputStream out;
ObjectOutputStream oos(out);
oos.writeObject(m);
// 下面代码省略,就是用 Input 之类的反序列化
我猜测应该没有问题,那么你的问题就出现在你的 request 得到的字节流不是按照 ObjectOutputStream 序列化的,或者序列化的对象不是 Model.
@Launcher: 朋友不知道你看没看这篇文章,这篇文章说的问题和我这个是一样的,我是多线程调用才出现这种问题的,单独一次是不出错的。单次的流程没有问题。
http://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e
@被淹死De鱼≈: 那篇文章我看了,它是用的自己编写的 socket 服务器,你给出的代码使用的是 request,我猜测你使用的是一个外部的 Http 服务。
你现在这样回答,那么我先假定你跟他的场景是一样的,如果我又猜错了,请你指出,本人愚笨,忘你见谅。
针对 http://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e 的问题的解决方案是,在 socket 的 InputStream 上,同时只能有一个读的操作。如果你想知道为什么,可以接着问。
@Launcher: 你的假设都是对的,在 socket 的 InputStream 上,同时只能有一个读的操作,怎么能做到多个操作呢
@被淹死De鱼≈: 在你的场景中(ObjectInputStream 使用了协议来解析字节流,就会存在“状态”,状态要共享就需要互斥,其结果就是每次仍然只有一个线程读取)做不到。
@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方法被多线程频繁的调用
@Launcher: 那您的意思是不是就是只能以队列的方式调用getdata
@被淹死De鱼≈: 你这个人不诚实!
public void getdata(HttpServletRequest request, HttpServletResponse response)
VS
s=new Socket("localhost",12345);
你的假设都是对的?
@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新手。