# Invalid Stream Header



## downset04 (9. Januar 2005)

Hallo
Ich bekomme so die  Exception " invalid stream header" sonst 
gehts wenn ich die anderen Input u Outputstreams nehme(DataInputStream,PrintStream)? was mache ich falsch? ich will Objekte im Netzwerk verschicken! und nicht Strings!

```
try {
socket = new Socket(localHost, PORT);
//in = new DataInputStream(socket.getInputStream());
//out = new PrintStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream (socket.getOutputStream());
thread = new Thread(this);
thread.start();
} catch (IOException e){
 print(e.getMessage());
}
```


----------



## Thomas Darimont (9. Januar 2005)

Hallo!

Wann bekommst du denn diese Exception? Wohl beim auslesen oder?
Wenn du mit Serialisierung arbeitest solltest du immer mit byte orientierten Streams arbeiten.

Das Beispiel hier funktioniert bei mir ohne Probleme:

```
/*
 * Created on 09.01.2005@13:22:14
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 */
public class ObjectStreamExample {

	public static void main(String[] args) {
		new ObjectStreamExample().doIt();
	}

	/**
	 *  
	 */
	private void doIt() {

		Thread server = new Thread() {
			public void run() {
				try {
					ServerSocket ss = new ServerSocket(2017);
					Socket s = ss.accept();

					ObjectInputStream ois = new ObjectInputStream(
							new BufferedInputStream(s.getInputStream()));

					Object o = ois.readObject();
					System.out.println(o);

					ois.close();

					s.close();

					ss.close();

				} catch (IOException e) {
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		};

		Thread client = new Thread() {
			public void run() {
				try {
					Socket s = new Socket("localhost", 2017);
					Serializable mto = new MyTransferObject();

					ObjectOutputStream oos = new ObjectOutputStream(
							new BufferedOutputStream(s.getOutputStream()));

					oos.writeObject(mto);
					oos.flush();
					oos.close();

					s.close();

				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
		};

		server.start();
		client.start();

	}

}
```

Hier MyTransferObject:

```
/*
 * Created on 09.01.2005@13:32:59
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.Serializable;

/**
 * @author Administrator
 *
 * TODO Explain me...
 */
class MyTransferObject implements Serializable {
	private String data = "Hallo Welt!";
	
	

	/**
	 * @return Returns the data.
	 */
	public String getData() {
		return data;
	}
	/**
	 * @param data The data to set.
	 */
	public void setData(String data) {
		this.data = data;
	}
	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		// TODO Auto-generated method stub
		return this.data;
	}
}
```

Wenn das nicht hilft mußt du mehr Source Code zeigen...

Btw, das was du mit einem ObjectInputStream lesen willst MUSS auch mit einem ObjectOutputStream geschrieben worden sein!

HTH,

Gruß Tom


----------



## downset04 (10. Januar 2005)

ok mehr code ich hab diesen chat umgebaut so daß ich nun messages verschicken kann und nicht nur strings sondern message Objekte nur leider funktioniert das nicht und ich weiß nicht worans liegt davor wurden einfach strings verschickt das  wär schön wenn sich jemand das mal anschaut?

danke!


Chat Applet

```
public class chatapplet extends Applet implements Runnable
{
	public static final int PORT = 8765;
	Socket socket;
	//DataInputStream in;
	//PrintStream out;
	TextField inputfield;
	TextArea outputarea;
	protected ObjectInputStream in;
	protected ObjectOutputStream out;
	Thread thread;
	private ChatMessage message;
	private ChatMessage send;

	public void init()
	{
		inputfield = new TextField();
		outputarea = new TextArea();
		outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
		outputarea.setEditable(false);

		this.setLayout(new BorderLayout());
		this.add("South", inputfield);
		this.add("Center", outputarea);

		this.setBackground(Color.lightGray);
		this.setForeground(Color.black);
		inputfield.setBackground(Color.white);
		outputarea.setBackground(Color.white);
	}

	public void start()
	{
		try
		{
			socket = new Socket(this.getCodeBase().getHost(), PORT);
			in = new ObjectInputStream (new BufferedInputStream(socket.getInputStream()));
			out = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
		} catch (IOException e)
		{
			this.showStatus(e.toString());
			say("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
		}

		say("Verbindung zum Server aufgenommen...");

		if (thread == null)
		{
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
		}
	}


	public void stop()
	{
		try
		{
			socket.close();
		} catch (IOException e)
		{
			this.showStatus(e.toString());
		}

		if ((thread !=null) && thread.isAlive())
		{
			thread.stop();
			thread = null;
		}
	}


	public void run()
	{
		//String line;
		

		try
		{
			while(true)
			{
				try {
					message = (ChatMessage) in.readObject();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				if(message != null)
					outputarea.appendText(message.getMessage()+'\n' );
			}
		} catch (IOException e) { say("Verbindung zum Server abgebrochen"); }
	}


	public boolean action(Event e, Object what)
	{
		if (e.target==inputfield)
		{
			String inp=(String) e.arg;
			 send = new ChatMessage(inp);

			try {
				//out.println(inp);
				out.writeObject(send);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			inputfield.setText("");
			return true;
		}

		return false;
	}


	public void say(String msg){
		outputarea.appendText("*** "+msg+" ***\n");
	}
}
```

ChatMessage = soll verschickt werden

```
public class ChatMessage implements Serializable {
	private String message;
	ChatMessage(String msg){
		message = new String(msg);
	}
	/**
	 * 
	 */
	public ChatMessage() {
		message = new String();
		
		// TODO Auto-generated constructor stub
	}
	String getMessage(){
		return message;
	}	
	public void setChatMessage(String msg){
		message = msg;
	}
	
	
}
```



Chat Server

```
public class chatserver extends JFrame implements Runnable
{
	public static final int PORT = 8765;
	protected ServerSocket listen;
	protected Vector connections;
	Thread connect;
	

	public chatserver() {	
		
		try
		{
			listen = new ServerSocket(PORT);
		} catch (IOException e)
		{
			System.err.println("Fehler beim Erzeugen der Sockets:"+e);
			System.exit(1);
		}

		connections = new Vector();
		connect = new Thread(this);
		connect.start();
		JPanel p = new JPanel();
		JButton close = new JButton("CloseServer");		
		close.addActionListener(new ActionListener()
				{
			public void actionPerformed(ActionEvent event)
			{
				connect.stop();
				System.exit(1);
					
				}
		});
		p.add(close);
		getContentPane().add(p);
		pack();
		setVisible(true);

	}

	public void run()
	{
		try
		{
			while(true)
			{
				Socket client = listen.accept();
				connection c = new connection(this, client);
				System.out.println(client.toString());
				connections.addElement(c);
				//PrintWriter out = new PrintWriter(client.getOutputStream(),true);
				//out.println("hello");
				System.out.println("hello");
				
			}
		} catch (IOException e)
		{
			System.err.println("Fehler beim Warten auf Verbindungen:"+e);
			System.exit(1);
		}
	}

	public static void main(String[] args)
	{
		new chatserver();
	}

	public void broadcast(ChatMessage message)
	{
		int i;
		connection you;

		for (i=0; i< connections.size(); i++)
		{
			you = (connection) connections.elementAt(i);
			try {
				//you.out.println(message);
				you.out.writeObject(message);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
```
Connections verwaltet alle Clients

```
class connection extends Thread
{
	protected Socket client;
	//protected DataInputStream in;
	//protected PrintStream out;
	protected ObjectInputStream in;
	protected ObjectOutputStream out;
	protected chatserver server;
	private ChatMessage message;

	public connection(chatserver server, Socket client)
	{
		this.server=server;
		this.client=client;

		try
		{
			in = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
			out = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
		} catch (IOException e)
		{
			try { client.close(); } catch (IOException e2) {} ;
			System.err.println("Fehler beim Erzeugen der Streams: " + e);
			return;
		}

		this.start();
	}


	public void run()
	{
		String line;

		try
		{
			while(true)
			{
				try {
					//line = in.readLine();
					message = (ChatMessage) in.readObject();
				} catch (ClassNotFoundException e1) {					
					e1.printStackTrace();
				}
				if(message!=null)
					server.broadcast(message);
			}
		} catch (IOException e)
		{
			System.out.println("Fehler:" + e);
		}
	}
}
```


----------



## flashray (10. April 2007)

Hallo Tom,

was sucht das BufferedStream in deiner Implementierung? Ein read bzw. writeObject liest bzw. schreibt doch genau ein Objekt. Also Bedarf es doch keiner Pufferung.


Vg Erdal



Thomas Darimont hat gesagt.:


> Hallo!
> 
> Wann bekommst du denn diese Exception? Wohl beim auslesen oder?
> Wenn du mit Serialisierung arbeitest solltest du immer mit byte orientierten Streams arbeiten.
> ...


----------



## Thomas Darimont (10. April 2007)

Hallo,

...übertrag doch einfach mal zum Spaß dieses TranferObject ;-)

```
/*
 * Created on 09.01.2005@13:32:59
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.Serializable;
import java.util.Random;

/**
 * @author Administrator
 *
 * TODO Explain me...
 */
class MyTransferObject implements Serializable {
    private String data = "Hallo Welt!";
    

    byte[] bytes;
    
    public MyTransferObject(){
      bytes = new byte[1024*1024*16]; //16 MB
      new Random().nextBytes(bytes);
    }

    /**
     * @return Returns the data.
     */
    public String getData() {
        return data;
    }
    /**
     * @param data The data to set.
     */
    public void setData(String data) {
        this.data = data;
    }
    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    public String toString() {
        // TODO Auto-generated method stub
        return this.data;
    }
}
```

Einmal mit BufferedInput/OutputStream und einmal ohne...:

```
/*
 * Created on 09.01.2005@13:22:14
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 */
public class ObjectStreamExample {

    public static void main(String[] args) {
        new ObjectStreamExample().doIt();
    }

    /**
     *  
     */
    private void doIt() {

        Thread server = new Thread() {
            public void run() {
                try {
                    ServerSocket ss = new ServerSocket(2017);
                    Socket s = ss.accept();

                    ObjectInputStream ois = new ObjectInputStream(
                            new BufferedInputStream(
                              s.getInputStream()
                              )
                            );

                    long time = -System.currentTimeMillis();
                    Object o = ois.readObject();
                    time += System.currentTimeMillis();
                    System.out.println(time);
                    
                    System.out.println(o);

                    ois.close();

                    s.close();

                    ss.close();

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        };

        Thread client = new Thread() {
            public void run() {
                try {
                    Socket s = new Socket("localhost", 2017);
                    Serializable mto = new MyTransferObject();

                    ObjectOutputStream oos = new ObjectOutputStream(
                             new BufferedOutputStream(
                              s.getOutputStream()
                              )
                            );

                    oos.writeObject(mto);
                    oos.flush();
                    oos.close();

                    s.close();

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        };
        server.start();
        client.start();
    }
}
```

Gruß Tom


----------



## flashray (10. April 2007)

Hallo Tom,

da ist kein signifikanter Geschwindigkeitsunterschied, wenn du das meinst. Und was seltsam ist, die Dauer schwankt sehr stark.


Vg Erdal


----------



## Thomas Darimont (10. April 2007)

Hallo,

in der Regel macht es immer sinn ungepufferte IO über einen Puffer Laufen zu lassen um den Durchsatz zu erhöhen. Der InputStream den man von einem Socket bekommt ist ein SocketInputStream der wiederum ein FileInputStream ist. Dazwischen ist nichts gepuffert (bis auf die Pufferung die auf Betriebssystemebene geschieht). Deshalb der zusätzliche BufferedInputStream / BufferedOutputStream... 

Gruß Tom


----------

