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?あなたは、読み取りの戻り値を無視して、それがバッファを埋めることを想定している
おかげでここ
なぜデータを2回読み取ろうとしていますか? – Jeffrey
@Jeffrey 1024バイトの2つの異なるブロックを送信しています。 – Stripies
はい、README.txtに2400バイトのテキストがある場合、2400 - 2048 = 352バイトの未送信データがあります。あなたはデータのチャンクを送るためにループを使うべきです – Jeffrey