0

I'm trying to create an ObjectInputStream from a BufferedInputStream created from a socket's inputstream. When I initialize the variable, it throws the StreamCorruptedException due to an invalid stream header. I tried searching and other solutions said that it was due to using different kinds of stream readers. In my code, all my Object I/O Streams use the same format.

Main:

public static void main(String[] args) {

    Server server = new Server("Room", "Server");
    Client client = new Client("Client", "localhost");

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

    Message m = new Message();
    m.addValue("Message", "Dummy Text");
    client.transmit(m);


}

Server listener :

    private void startServerListener() {

    while (true) {

        try {

            ObjectOutputStream writer;
            ObjectInputStream reader = new ObjectInputStream(
                    new BufferedInputStream(socket.getInputStream())); // Exception points here

            Message msg = (Message) reader.readObject();
            System.out.println(3);
            if (msg.hasValue("Username")) {
                System.out.println(4);
                this.username = msg.getValue("Username");
                msg.remove("Username");
                Message tmp_msg = new Message();
                tmp_msg.addValue("Raw Message", username + " has joined");

                for (Listener l : Server.clients) {

                    Socket socket = l.getSocket();
                    writer = new ObjectOutputStream(
                            new BufferedOutputStream(
                                    socket.getOutputStream()));
                    writer.writeObject(tmp_msg);
                    writer.flush();

                }

            }
            if (msg.hasValue("Message")) {
                System.out.println(5);
                for (Listener l : Server.clients) {

                    Socket socket = l.getSocket();
                    writer = new ObjectOutputStream(
                            new BufferedOutputStream(
                                    socket.getOutputStream()));
                    writer.writeObject(msg.getValue("Message"));
                    writer.flush();

                }

            }

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

    }

}

Client that sends the data :

private String username, ip;
private ObjectOutputStream writer;

public Socket socket;

public Client(String username, String ip) {

    this.username = username;
    this.ip = ip;

}

@Override
public synchronized void run() {

    try {

        socket = new Socket(ip, 22600);
        writer = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        Message msg = new Message();
        msg.addValue("Username", username);
        writer.writeObject(msg);
        writer.flush();
        Listener listener = new Listener(socket, Client.class);
        System.out.println(0);

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

}

public synchronized void transmit(Message msg) {

    try {

        System.out.println("a");
        System.out.println(1);
        writer.writeObject(msg);
        writer.flush();
        System.out.println(2);

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

}

Stack trace :

java.io.StreamCorruptedException: invalid stream header: 7371007E
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at com.Listener.startServerListener(Listener.java:89)
at com.Listener.access$1(Listener.java:82)
at com.Listener$2.run(Listener.java:37)
at java.lang.Thread.run(Unknown Source)
Lexicographical
  • 501
  • 4
  • 16

0 Answers0