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

标签 java serialization io

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

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 写入了一个 header ,这是 objectIutputStream 所期望的。由于您不是在编写多个流,而只是多个对象,因此在套接字输入上创建的下一个 objectInputStream 无法找到第二个 header ,并抛出异常。)

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

关于java.io.StreamCorruptedException : invalid stream header: 7371007E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939073/

相关文章:

java - 泛型参数、项目还是节点?

java - Java 中的正则表达式环视构造 : advise on optimization needed

java - 计算文件中的单词数

使用 FileWriter 的 java.lang.NullPointEreException

java - 在 case 标签中使用 boolean 表达式的 Switch 语句

java - 如何用JAVA获取 Crystal 报表参数名称

c# - 使用 JSON 序列化请求对象

c# - 反序列化 json 对象数组,其中包含 json 对象

python - 如何正确序列化 python 位数组?

Java多线程I/0和通信问题