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

Ale*_*lex 20 java io serialization

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

StreamCorruptedException.  
Run Code Online (Sandbox Code Playgroud)

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

客户端写方法

   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;
 }
Run Code Online (Sandbox Code Playgroud)

服务器读取方法

//in is an inputStream Defined in the server
SecMessage rcvdMsgObj;
rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject();
return rcvdMsgObj;
Run Code Online (Sandbox Code Playgroud)

而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
}
Run Code Online (Sandbox Code Playgroud)

mdm*_*dma 10

如果要发送多个对象,它往往简单的把它们某种架/集的像Object[]List.它可以节省您必须明确检查流的结尾,并负责明确传输流中有多少对象.

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

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

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

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