0

私は奇妙な問題を抱えています。チャット オプションを使用して単純なクライアント - サーバー アプリを作成しようとしていますが、問題が発生しました - オブジェクト入力ストリームが間違ったクラスを読み取ります。エラーは次のとおりです。

Exception in thread "Thread-4" java.lang.ClassCastException: org.oxomoco.packets.PacketAlive cannot be cast to org.oxomoco.packets.PacketMessage
at org.oxomoco.server.SocketConnectionServer.run(SocketConnectionServer.java:52)
at java.lang.Thread.run(Unknown Source)

そして、それはここで起こります:

 PacketMessage pm = (PacketMessage)ois.readObject();

次のようなループになっています。

            while(true){




            //if(ois.readObject() instanceof PacketMessage){


            //  pm = (PacketMessage)ois.readObject();
            //  se.println(ois.readObject().toString());
            //}



            if((ois.readObject() instanceof PacketMessage)==true){
                System.out.println("It is: " + (ois.readObject() instanceof PacketMessage));

                PacketMessage pm = (PacketMessage)ois.readObject();

                se.acprintln(">>",uname + ": " +pm.getMsg());

            }
            if((ois.readObject() instanceof PacketAlive)==true){
                System.out.println("-it is: " + (ois.readObject() instanceof PacketAlive));
                PacketAlive pa = (PacketAlive)ois.readObject();
            }

    }

どういうわけか-インスタンスをチェックしても-オブジェクト入力ストリームは、PacketAliveのインスタンスである必要がある場合、PacketMessageのインスタンスです。その理由、そしてもちろん、それを修正する方法を知っている人はいますか?

4

2 に答える 2

5

あなたは実行しています

ois.readObject()

数回、毎回異なるオブジェクト (異なるクラスの?) を取得します。各オブジェクトをそこに残すのではなく、ストリームからreadObject() プルします。

代わりに、それを読み、変数に割り当ててから、テストなどを実行します。

while (true) {
   Object obj = ois.readObject();
   // do something with obj...
于 2012-07-20T16:35:42.340 に答える
3

ois.readObject() の戻り値を 2 回呼び出すのではなく、変数に代入してみてください。

readObject を呼び出すたびに、ストリームからより多くのバイトを消費しているため、毎回同じオブジェクトが返されるわけではありません。

于 2012-07-20T16:35:04.027 に答える