2011-10-18 61 views
0

私の質問は、私はそれに別のオブジェクト(msg)を含むオブジェクトクラス(パケット)を持っているということです。私は両方のクラスがSerializableを実装するようにします。私のコードの一部私は私のプログラムを実行するときしかし、私はこのエラー「:無効な型コード00 java.io.StreamCorruptedException」:参照オブジェクトの書き込み/読み込み

outStrm=new ObjectOutputStream(mySocket.getOutputStream()); 
inStrm=new ObjectInputStream(mySocket.getInputStream()); 
outStrm.writeObject(new packet()); 
outStrm.flush(); 

を、サーバー側で私はこの

Socket client = listen_socket.accept(); 
in=new ObjectInputStream(client.getInputStream()); 
out=new ObjectOutputStream(client.getOutputStream()); 
p=(packet) in.readObject(); 
ように読めます

私は多くのパケットを送信し、奇妙な部分は、私はそれを(ステップバイステップで)私はエラーが表示されませんが、私はこのエラーが発生した実行時にデバッグすることです!私を助けてください。

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 

class ServerThre 
    extends Thread 
{ 
    Socket client; 
    ObjectInputStream in; 
    ObjectOutputStream out; 

    public ServerThre(Socket client_socket) 
    { 
     client = client_socket; 
     try 
     { 
      in = new ObjectInputStream(client.getInputStream()); 
      out = new ObjectOutputStream(client.getOutputStream()); 
     } 
     catch (IOException e) 
     { 
      try 
      { 
       client.close(); 
      } 
      catch (IOException e2) 
      { 
      } 
      System.err.println("Exception while getting input streams: " + e); 
      return; 
     } 
     this.start(); 
    } 

    private packet getPacket() throws IOException 
    { 
     packet p; 
     try 
     { 
      p = (packet)in.readObject(); 
      if (p != null) 
      { 
       return p; 
      } 
     } 
     catch (ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    public void run() 
    { 
     while (!client.isClosed()) 
     { 

      packet p = null; 
      try 
      { 
       p = getPacket(); 
      } 
      catch (IOException e1) 
      { 
       e1.printStackTrace(); 
      } 

      if (p == null) 
      { 
       System.out.print("Connection closed by server, exiting"); 
       return; 
      } 

     }// end of while 
    } 

} 
+0

コードとスタックトレースを送信する必要があります。問題はあなたが投稿した8行ではなく*表示されているコードである。 –

+0

クラスの両方をシリアライズ可能にすることは本当ですか?私の総コードはたくさんあります。 – Sara

+1

これを試してみましょう - これを読んでください:[SSCCE](http://sscce.org/)。問題があることを示すものを作成します。戻ってきて、投稿してください。誰もあなたを助けることはできません。あなたが投稿したスニペットには何も問題はありません。 –

答えて

0

このコードにはいくつかの奇妙な点があります。

  1. getPacket()p != nullためのテストが完全に無意味です。

  2. 接続が終了しているp == nullに相当する後のテストが間違っています。その状況の下ではnullではなく、EOFExceptionが発生します。

  3. がソケットを閉じたかどうかをSocket.isClosed()が通知します。

通常、1つのObjectInputStreamを読み込みに使用し、複数のObjectOutputStreamを書き込み用に使用すると、「無効な型コード」が発生します。両端のソケットの寿命は、それぞれ1つずつ使用してください。

+0

私は私の問題を解決しました。 – Sara

関連する問題