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)