views:

1258

answers:

2

my problem is when it tries to read the object the second time, it throws the exception

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

The first time I send the exact same object message, however when I try doing the same thing the second time, it throws the error above. Do I need to re-intialize the readObject() method? I even printed out the message object that is being received by the line below and its exact the same as the first instance where it works ok.

Object buf = myInput.readObject();

I'm assuming there's some problem with appending, but I really have no use for appending. I just want to read a fresh line everytime. I'd really appreciate some help in fixing this bug. Thank you.

==================================

before that one line, I'm just creating the input and output objects for the socket, this is in the run() method. The object declaration is outside the run() method in the class:-

@Override
public void run() {
    try {
        sleep((int) 1 * 8000);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        //Creating input and output streams to transfer messages to the server
        myOutput = new ObjectOutputStream(skt.getOutputStream());
        myInput = new ObjectInputStream(skt.getInputStream());
        while (true) {
            buf = myInput.readObject();
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

your right, I don't close the object. I'm not sure how to do that.

+1  A: 

I've reformatted your code to show what I think you meant. Please revert it if it's wrong. It looks like you intended to override run() in java.lang.Thread, but you were missing the closing brace in your while(true) block. Also, you generally shouldn't swallow exceptions or catch Exception.

Sorry if this is irrelevant to your problem.

Addendum: "You must create the ObjectInputStream and the ObjectOutputStream for the life of the socket at both ends..."—ejp.

trashgod
Thank you for your reply. My question mustve been misleading. My problem is that I get this streamcorruptedexception of type AC and im not sure how to fix that.I just have an additional question. Is it mandatory to close streams? Because I am not closing them at any place.
rookie
I've added a link that may be relevant.
trashgod
I'm sorry but I couldn't find the link
rookie
The link is to the quote's author, "ejp": http://forums.sun.com/thread.jspa?threadID=5177084
trashgod
+1  A: 

The underlying problem is that you are using a new ObjectOutputStream to write to an existing ObjectInputStream that you have already used a prior ObjectOutputStream to write to. These streams have headers which are written and read by the respective constructors, so if you start another ObjectOutputStream you will write a new header, which starts with - guess what? - 0xAC, and the existing ObjectInputStream isn't expecting another header at this point so it barfs.

In the Java Forums thread cited above, I should have left out the part about 'anew for each object at both ends': that's just wasteful. Use a single OOS and OIS for the life of the socket. And don't use any other streams on the socket. If you want to forget what you've written, use ObjectOutputStream.reset().

EJP
+1 @rookie: This is the correct answer, and from the original source! :-)
trashgod