java.io.StreamCorruptedException:无效的流标题:7371007E

我有一个客户端服务器应用程序使用对象进行通信
当我只从客户端向服务器发送一个对象时,一切正常。
当我尝试在同一个流上一个接一个地发送几个对象时,我得到了

StreamCorruptedException. 

有人可以指导我这个错误的原因吗?

客户端写方法

  private SecMessage[] send(SecMessage[] msgs) { SecMessage result[]=new SecMessage[msgs.length]; Socket s=null; ObjectOutputStream objOut =null; ObjectInputStream objIn=null; try { s=new Socket("localhost",12345); objOut=new ObjectOutputStream( s.getOutputStream()); for (SecMessage msg : msgs) { objOut.writeObject(msg); } objOut.flush(); objIn=new ObjectInputStream(s.getInputStream()); for (int i=0;i<result.length;i++) result[i]=(SecMessage)objIn.readObject(); } catch(java.io.IOException e) { alert(IO_ERROR_MSG+"\n"+e.getMessage()); } catch (ClassNotFoundException e) { alert(INTERNAL_ERROR+"\n"+e.getMessage()); } finally { try {objIn.close();} catch (IOException e) {} try {objOut.close();} catch (IOException e) {} } return result; } 

服务器读取方法

 //in is an inputStream Defined in the server SecMessage rcvdMsgObj; rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject(); return rcvdMsgObj; 

而SecMessage类是

 public class SecMessage implements java.io.Serializable { private static final long serialVersionUID = 3940341617988134707L; private String cmd; //... nothing interesting here , just a bunch of fields , getter and setters } 

如果要发送多个对象,通常最简单的方法是将它们设置为Object[]List类的持有者/集合。 它可以节省您必须明确检查流的结尾并负责明确传输流中有多少对象。

编辑:现在我格式化了代码,我看到你已经有了数组中的消息。 只需将数组写入对象流,然后在服务器端读取数组。

您的“服务器读取方法”只读取一个对象。 如果多次调用它,则会出现错误,因为它尝试从同一输入流中打开多个对象流。 这不起作用,因为所有对象都写入客户端的同一对象流,因此您必须在服务器端镜像这种安排。 也就是说,使用一个对象输入流并从中读取多个对象。

(你得到的错误是因为objectOutputStream写了一个标题,这是objectIutputStream所期望的。由于你没有编写多个流,而只是多个对象,所以在套接字输入上创建的下一个objectInputStream无法找到第二个标题,并抛出一个例外。)

要修复它,请在接受套接字连接时创建objectInputStream。 将此objectInputStream传递给您的服务器读取方法并从中读取Object。

当我只从客户端向服务器发送一个对象时,一切正常。

当我尝试在同一个流上一个接一个地发送几个对象时,我得到了StreamCorruptedException

实际上,您的客户端代码是将一个对象写入服务器并从服务器读取多个对象。 并且服务器端没有任何东西正在编写客户端试图读取的对象。

如果您在一侧使用Socket在另一侧使用SSLSocket也可能发生此exception。 一致性很重要。