2012-04-26 11 views
1

ここに私が使用しているコードがあります。奇妙な結果を返すObjectInputStream

クライアント:

public static void main(String[] args) throws IOException { 
    Socket socket = new Socket("0.0.0.0", 5555); 
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 
    FileInputStream in = new FileInputStream("C:/Documents and Settings/Owner/Desktop/Client/README.txt"); 
    byte[] b = new byte[1024]; 
    int i = 0; 
    i = in.read(b); 
    out.writeInt(i); 
    out.write(b, 0, i); 
    out.flush(); 
    i = in.read(b); 
    out.writeInt(i); 
    out.write(b, 0, i); 
    out.flush(); 
    out.close(); 
    in.close(); 
    socket.close(); 
} 

サーバー:

public static void main(String[] args) throws IOException { 
    ServerSocket ss = new ServerSocket(5555); 
    Socket s = ss.accept(); 
    ObjectInputStream in = new ObjectInputStream(s.getInputStream()); 
    FileOutputStream fos = new FileOutputStream("C:/README.txt"); 
    int i = 0; 
    i = in.readInt(); 
    System.out.println(i); 
    byte[] bytes = new byte[i]; 
    in.read(bytes); 
    i = in.readInt(); 
    System.out.println(i); 
    byte[] bytes2 = new byte[i]; 
    in.read(bytes2); 
    fos.write(bytes); 
    fos.close(); 
    s.close(); 
    ss.close(); 
} 

のREADME.txtはそれで〜2400のバイトを持つファイル。これを実行すると、サーバーはこれを出力します。

その後のjava.lang.OutOfMemoryErrorをスローします。

なぜ誰が私に読んでいるのか教えてもらえますか?1024の代わりに1869488225?あなたは、読み取りの戻り値を無視して、それがバッファを埋めることを想定している

おかげでここ

+0

なぜデータを2回読み取ろうとしていますか? – Jeffrey

+0

@Jeffrey 1024バイトの2つの異なるブロックを送信しています。 – Stripies

+0

はい、README.txtに2400バイトのテキストがある場合、2400 - 2048 = 352バイトの未送信データがあります。あなたはデータのチャンクを送るためにループを使うべきです – Jeffrey

答えて

1
in.read(bytes); 
in.read(bytes2); 

。ここではread()readFully()に変更する必要がありますが、通常はread()の結果を無視しないでください。 EOSを示す-1にすることも、1からバッファサイズまでの任意の数にすることもできます。誤って長さゼロのバッファを指定すると、ゼロにすることもできます。