ObjectInputStream和getInputStream

时间:2013-04-10 04:37:33

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

我正在开展一个学校项目,下面的代码是一个用于构建项目的示例(应该没有任何问题,但不能......)。没有编译错误但是当我使用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=...的顺序,但没有运气。请帮忙......谢谢。

2 个答案:

答案 0 :(得分:1)

根据我对注释的理解,您尝试使用ObjectInputStream从telnet连接读取对象。

你做不到。如果您打算使用ObjectInputStream,则需要使用ObjectOutputStream编写其他连接程序。

你的telnet客户端并没有真正对Java ObjectOutputStream,ObjectInputStream和Serialization大肆宣传。

所以我尝试使用包装在BufferedReader中的InputStreamReader。

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

答案 1 :(得分:0)

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

由于您需要DataObject,因此客户端需要发送DataObject。当你使用telnet时,它会连接,但从那里你不能以java Object stream理解的方式发送DataObject。

请参阅http://zerioh.tripod.com/ressources/sockets.html了解服务器/客户端示例。

此外,由于它的一些学校练习试图理解这个概念而不仅仅是复制。