【问题标题】:ObjectInputStream and getInputStreamObjectInputStream 和 getInputStream
【发布时间】:2013-04-10 04:37:32
【问题描述】:

我正在开展一个学校项目,以下代码是为构建项目提供的示例(应该可以正常工作,但不是......)。没有编译错误,但是当我使用 telnet 测试它时,显示以下消息:

java.io.StreamCorruptedException: invalid stream header: 56543130 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at ThreadedDataObjectHandler.run(ThreadedDataObjectServer.java:41)

第 41 行是

ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());

这是我的代码:

import java.io.*;
import java.net.*;
import java.util.*;
public class ThreadedDataObjectServer {  
    public static void main(String[] args ) {  

      try 
  {  ServerSocket s = new ServerSocket(3000);

     for (;;)
     {  Socket incoming = s.accept( );
        new ThreadedDataObjectHandler(incoming).start();

     }   
  }
  catch (Exception e) 
  {  e.printStackTrace();
      } 
   } 
}

class ThreadedDataObjectHandler extends Thread
{
DataObject myObject = null;
private Socket incoming;
private String greeting="Hello!";
public ThreadedDataObjectHandler(Socket incoming) 
   { 
        this.incoming = incoming;
   }

   public void run()
   {  try 
      {     

    ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());

    ObjectOutputStream out =new ObjectOutputStream(incoming.getOutputStream());

    myObject = (DataObject)in.readObject();

    System.out.println("Message read: " + myObject.getMessage());

    myObject.setMessage("Got it!");

    System.out.println("Message written: " + myObject.getMessage());


    out.writeObject(myObject);

    in.close();

    out.close();

    incoming.close();    

  }
  catch (Exception e) 
  {  e.printStackTrace();
  } 
   } 
}
class DataObject implements Serializable{
    protected String message;
    public DataObject(){
        message="";
    }
public void setMessage(String m){
    message=m;
}
    public String getMessage(){
    return message;
    }
}

我尝试的是切换语句的顺序 ObjectInputStream in=...ObjectOutputStream out=... 但没有运气。请帮忙...谢谢。

【问题讨论】:

  • 你在这段代码中做了什么?不,你想做什么?
  • 您确定客户端正在使用 ObjectOutputStream 写入对象吗?
  • 你需要进行序列化。
  • @ay89 这只是一个小测试,允许客户端和服务器相互通信,但必须使用 DataObject 类才能实现
  • 您的客户端套接字服务器是否也使用 ObjectOutputStream 发送数据.. 可能是重复的问题stackoverflow.com/questions/5560939/…

标签: java stream runtime-error objectinputstream object-serialization


【解决方案1】:

根据我从 cmets 中了解到的情况,您正尝试使用 ObjectInputStream 从 telnet 连接读取对象。

你不能那样做。如果您要使用 ObjectInputStream,则需要其他连接程序使用 ObjectOutputStream 编写。

您的 telnet 客户端并不真正关心 Java ObjectOutputStream、ObjectInputStream 和序列化。

所以我会尝试将 InputStreamReader 包裹在 BufferedReader 中。

如果您只是想测试连接性,只需编写一个小型 java 程序,该程序将连接到您的程序,而不是使用 telnet。

【讨论】:

    【解决方案2】:

    David 正如我在 cmets 中提到的,您必须编写一个客户端,该客户端使用 ObjectOutputStream 将相同的 DataObject 发送到服务器套接字。

    由于您需要 DataObject,因此客户端需要发送 DataObject。当您使用 telnet 时,它会连接,但从那里您无法以 java 对象流理解的方式发送 DataObject。

    有关服务器/客户端示例,请参阅http://zerioh.tripod.com/ressources/sockets.html

    另外,因为它是一些学校练习,所以试着理解这个概念,不要只是复制。

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多