2016-06-29 5 views
0

まず第一に、私は知っている、これは重複した質問だが、他の答えでは、私はそれを理解できない!
私はjavaのソケットを使用してクライアントとサーバーの接続を行っています。私はListenerというクラスを持っています。これは、新しいクライアントを得るたびにクライアントソケットに割り当てます。それから私は繰り返しクライアントに耳を傾けています。クライアントから回答が得られたら、それをインターフェイス "クラス"のメソッドに送ります(この最後のことは実際にはこの質問ではありませんが、
マイコード)それについて尋ねる:「s」はソケットで、「OB」Java - エラーStreamCorruptedException:無効なタイプコード:AC

  while(!s.isClosed()){ 
      ob = new ObjectInputStream(s.getInputStream()); 
      try { 
       handler.objectReceived(ob.readObject(), instance); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



     } 

はObjectOutputStreamのある、そして「ハンドラは、」上記のインターフェースです。しかし、しばらくしてから、私はエラーjava.io.StreamCorruptedException:handler.objectReceived(ob.readObject(), instance);行の無効な型コード:ACを取得します...

任意のヘルプ?

注:この質問に重複してはいけません。私は他の答えを理解することはできません、そして、私はそれをはっきりと説明する人を求めています。その後、改造が必要な場合は削除することができます、答えてください!私はちょうどこのエラーで本当に迷惑になっています!

+0

また、ソケットを介してオブジェクトを送信しているコードを投稿することもできます – AntJavaDev

+0

ここに謎はありません。あなたは、複製物の私の答えがしないことを正確にしています。ループの外側で 'ObjectInputStream'を作成します。 NB 'isClosed()'は適切な終了条件ではありません。正しい条件は 'EOFException'です。 – EJP

+0

私はそれをループの外に置きましたが、それでもエラーを返します... – JHacking

答えて

0

おそらく、ObjectInputStreamの再作成を続けることが考えられます。 これにコードを変更すると、ストリームが破損していないと仮定しても問題ありません。

ob = new ObjectInputStream(s.getInputStream()); 
while(!s.isClosed()){ 

    try { 
     handler.objectReceived(ob.readObject(), instance); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

ObjectOutputStreamを作成するオブジェクトを1回だけ作成するコードを想定しています。 ObjectOutputStreamを作成すると、4バイトからなるヘッダーが書き込まれます。

bout.writeShort(STREAM_MAGIC); 
bout.writeShort(STREAM_VERSION); 

これで、ObjectInputStreamを作成すると、ヘッダーが読み込まれます(この呼び出しはコンストラクターで行われます)。

これで、ObjectInputStreamを再作成し続けるため、データストリームに存在しないヘッダーを読み取ろうとします。

本質的にObjectOutputStreamとObjectInputStreamを正確に1回作成します。

+0

ありがとうございます!私は今、なぜエラーが発生するのか理解していますが、私がそれを変更したと思っても、それでもエラーが出ます。 – JHacking

+0

この回答は正しい治療法ですが、正しい理由はありません。正当な理由で私の答えは重複しています。 – EJP

+0

@EJPああ、私は入力ストリームを何度も作成するという奇妙な振る舞いに気付きました。あなたが言ったことは、Javaソースと一致するようです。私は答えを更新します。 – user254948

関連する問題