1

これが私が使用しているコードです。

クライアント:

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 バイトが含まれています。これを実行すると、サーバーはこれを出力します。

1024

1869488225

次に、java.lang.OutOfMemoryError をスローします。

1024 ではなく 1869488225 を読んでいる理由を誰か教えてもらえますか?

ありがとう

4

1 に答える 1

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

ここでは、 read の戻り値を無視して、バッファがいっぱいになると想定しています。ここに変更read()する必要readFully()がありますが、一般的には結果を無視するべきではありませんread()。EOS を示す -1 にするか、1 からバッファ サイズまでの任意の数にすることができます。うっかり長さゼロのバッファを指定すると、ゼロになることさえあります。

于 2012-04-26T01:28:41.913 に答える