Invalid Stream Header

downset04

Erfahrenes Mitglied
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!
Code:
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());
}
 
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:
Code:
/*
 * 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:
Code:
/*
 * 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
 
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
Code:
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
Code:
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
Code:
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
Code:
 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);
		}
	}
}
 
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

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:
Code:
/*
 * 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:
Code:
/*
 * 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
 
Hallo,

...übertrag doch einfach mal zum Spaß dieses TranferObject ;-)
Java:
/*
 * 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...:
Java:
/*
 * 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
 
Hallo Tom,

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


Vg Erdal
 
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
 
Zurück