当前位置: 首页 > 面试题库 >

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

戴靖
2023-03-14
问题内容

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

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[]or
List。它省去了必须显式检查流结束的麻烦,并省去了显式传输流中有多少个对象的麻烦。

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

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

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

要解决此问题,请在接受套接字连接时创建objectInputStream。将此objectInputStream传递到服务器的read方法,并从中读取Object。



 类似资料:
  • 问题内容: 我不断得到这个得到这个: 服务器端我用它来发送和接收int,工作正常。 服务器: 客户: 但是,当我尝试像这样发送对象时,就会出现错误。 服务器: 客户: 任何帮助都会很好。这是我在游戏开始之前最初发送填字游戏的时间 根据jtahlborn的建议,我将代码更改为仅使用对象流,而不使用数据流 服务器 客户 问候,C. 问题答案: 不要用多个输入/输出流包装套接字流。这将以各种不良方式打破

  • 所以我见过很多不同的问题,但没有明确的帮助,至少对我的理解或我的个人应用。我正在制作一个套接字“聊天室”程序,允许用户通过中央服务器发送图像给选定的用户。我可以建立要连接的客户端,但当发送映像时,会出现此错误。下面是我的代码: 客户: 中央服务器主页: 中央服务器用户:

  • 问题内容: 我是一名练习File IO技能的学生,遇到使用ObjectInputStream从文件读取对象的问题。代码始终抛出InvalidClassException,但我找不到代码是如何将其在线或通过反复试验将其抛出的。这是我的代码: 我编写了所有单独的catch块,以弄清楚抛出了什么异常,并且该异常总是抛出InvalidClassException。 这也是我的树类: 这是我的写文件功能:

  • 问题内容: 关于如何解决此错误的任何想法?我在Hibernate中使用Spring JPA。下面的必要详细信息。 实体类别1: 用户的实体类: 和stacktrace: stacktrace非常大。我将下面的整个stacktrace粘贴以供参考,并在此处粘贴快速TL; DR: 完整的堆栈跟踪如下: 更新: 我将Ways实体类更新为以下内容,但仍然出现错误: 问题答案: 当无法反序列化某些内容时,就

  • 问题内容: 升级到Django 1.5后,我开始出现如下错误: 我已经 在文件中进行了设置。 这里发生了什么?有人假装成为Google并访问我的网站吗?还是有人错误地设置其HTTP_HOST标头的良性案例? 问题答案: 如果你ALLOWED_HOSTS的设置正确,则可能有人通过欺骗标头来探测你的站点是否存在漏洞。 Django开发人员正在讨论将其从500内部服务器错误更改为400响应

  • 问题内容: 我的节点: 这是我的: 运行成功并且Redis / Nginx安装正确,但是节点实例抛出此错误: 我到处搜索,似乎找不到有效的解决方案。我尝试使用常规设置url:,特别是install 和使用图像。 我已经读到,当人们尝试在OS X(我的OS)上构建了Linux env之后使用bcrypt时,会发生这种情况,但是我认为这不是问题,因为我正在使用docker和boot2docker。 问