私はサーバー側にいて、クライアントからバイナリストリームとして画像を受け取ります。サーバーは、画像を処理していることを検出し、クライアントからの前のメッセージを介してサーバーに到着したバイト単位のサイズを検出します!
サーバーには、読み取るはずのファイルのサイズがあり、ストリーム... Eter to whileループ... クライアントストリームから読み取り、すぐにファイルに書き込み、バッファをリセットしてすべてを読み取り
ます数キロバイト前までは正常に機能しますファイルの終わり数キロバイトがファイルに書き込まれません...サーバーライブラリに小さいファイルが取得されます...(そして、下部に小さな灰色の行がある画像を見ることができます.
ここに私の試み:
/*loop*/ while (bytesRemaining!=0) {
try {
// read from client
baos = new ByteArrayOutputStream();
bytesRemaining = sizeToread - readtotal;
bytesRead = OIS.read(aByte, 0, bytesRemaining);
readtotal+=bytesRead;
System.out.println( ", Remaining: " +bytesRemaining);
System.out.println("read at oce: "+bytesRead) ;
System.out.println(++i+") have Read: "+ readtotal+", aByte:"+aByte[i-1]);
try {
baos.write(aByte); // write first byte to buffer
try{
bos.write(baos.toByteArray(),0,bytesRead);
}catch (IOException s){ System.out.println("not write to file"+s);}
baos.reset();
// bos.flush();
} catch (IOException ex) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("baos.write(aByte); error = "+ex );
}
// if (!(OIS.available()> 0))break; // until uavailabil stream
} catch (EOFException eoff) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, eoff);
System.out.println("Line 601 error= "+eoff );
break;
} catch (IOException ex) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Line 612,613 error= "+ex );
}
} //loop End ///////////////////////////////////////////
注:ファイル サイズ: 474591
私のプリントは次のとおりです。
...
...
...
458) have Read: 468992, aByte:52
, Remaining: 5599
read at oce: 1024
459) have Read: 470016, aByte:59
, Remaining: 4575
read at oce: 1024
460) have Read: 471040, aByte:-117
, Remaining: 3551
read at oce: 1024
461) have Read: 472064, aByte:-110
, Remaining: 2527
read at oce: 1024
462) have Read: 473088, aByte:-8
, Remaining: 1503
read at oce: 1024
463) have Read: 474112, aByte:-124
, Remaining: 479
read at oce: 479
464) have Read: 474591, aByte:125
, Remaining: 0
read at oce: 0
465) have Read: 474591, aByte:30
realfile: C:\wamp\www\RandomSendServer\images\1384252358431.jpg
have Read: 474591 !!!
URL sent Back
474591 の代わりにサイズ 466944 のファイルを取得します .... ヘルプ
アップデート
according to answer 1 I make this change... my loop now looks:
while ((bytesRead = OIS.read(aByte))>1)
{ bos.write(aByte,0,bytesRead);
i+=bytesRead;
System.out.println(bytesRead+" "+i);
}
プリント:
合計読み取り: 474591 実ファイル: C:\wamp\www\RandomSendServer\images\1384262866220.jpg URL が送信されました
しかし、同じ問題はまだ ループが474,591をすべて読み取ったことを示しています...しかし、ファイルを確認すると、そのサイズは次のとおりです:466,944
最終的解決
while( ( bytesRead = OIS.read(aByte))>0)
{
fos.write(aByte,0,bytesRead);
i+=bytesRead; // i is a counter
if(i==sizeToread) break; // force to stop when read all the bytes in the file!
}