2016-09-12 10 views
0

ソケットを使用してサーバーから45 MBのファイルをダウンロードしています。私のシステムのトラフィックを測定すると、約4MB/sのダウンロード速度を示しますが、Javaでは60KBしか測定しません。サーバーからクライアントへファイルを転送する速度が非常に遅い

クライアント両面:

int fileSize = Network.in.readInt(); //DataInputStream 
byte[] data = new byte[fileSize]; 
for(int i = 0;i < data.length;i++) 
{ 
    if(i % 1024 == 0)Log.info("Downloading: " + (i/1024) + " KB/" + (fileSize/1024) + " KB"); 
    data[i] = Network.in.readByte(); 
} 
//int bytesRead = Network.in.read(data,0,data.length); 
//int current = bytesRead; 
// 
//do {if(current % 16384 == 0)Log.info("Downloading: " + (current/1024) + " KB/" + (fileSize/1024) + " KB"); 
//  bytesRead = Network.in.read(data, current, (data.length-current)); 
//  if(bytesRead >= 0) current += bytesRead; 
//} while(bytesRead > -1); 

サーバー両面:

out.writeInt(data.length); //DataOutputStream 
//for(int i = 0;i < data.length;i++) 
//{ 
// out.writeByte(data[i]); 
//} 
out.write(data, 0, data.length); 

コメントアウトされている代替手段を使用するには全く違いはありません。

+0

を行うことができますreadFully

int fileSize = Network.in.readInt(); //DataInputStream byte[] data = new byte[fileSize]; Network.in.readFully(data); 

を使用して...と? –

+0

受信したバイトの現在の数をループに出力するだけです。 – Geosearchef

+0

私のロギングシステムは現在の時刻を表示するので、1秒間にどれだけダウンロードされたかを計算できます。 45 MBをダウンロードするのに約13〜14分かかるため、ダウンロード速度も約60 kB/sになります。 – Geosearchef

答えて

1

byte[]を作成し、byte[]に読み込んでいますが、一度に1バイトしか読み込まないため、ファイル内の各バイトごとにオペレーティングシステムを1回呼び出すことを意味します。私は一度にbyte[]を読むことをお勧めします。例えばあなたがあなたの速度を測定しますどのように*あなたは徐々にそれを見るために必要がある場合は

for (int start = 0; start < fileSize; start += 8192) { 
    Log.info("Downloading: " + (start/1024) + " KB/" + (fileSize/1024) + " KB"); 
    Network.in.readFully(data, start, Math.min(fileSize - start, 8192)); 
} 
+0

まだ同じ問題、約60KB/sですが、その間は何もできません.4MB/sの全帯域幅を使用します。 – Geosearchef

+0

@Geosearchefは確かに理にかなっていません。サーバーのインターネット接続のアップロード速度はどのくらいですか? –

+0

@Geosearchefこれをループバックでテストするとどうなりますか? –

関連する問題