-1

1台のAndroidフォンとPCからのデータ転送にソケットを使用していDataInputStreamます.

ただし、データ転送には時間がかかり、4 MB のファイルを転送するのに約 10 分かかります。

誰かがそれを行うためのより良い方法を提案できますか?

コードにいくつかの変更を加えたところ、約 1 MB のデータを読み取るのに 15 秒かかっています。その性能を向上させたい。私のコードは次のとおりです。

InputStream is= socket.getInputStream();
DataInputStream inChannel= new DataInputStream(new BufferedInputStream(in));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int oneByte;
while ((oneByte = inChannel.read()) != -1) {
        if (oneByte == 0) {
            break;
        }        
        baos.write(oneByte);
        byteCount++;
    }
byte[] inData = baos.toByteArray();
baos.close();
4

1 に答える 1

-1

その間に空のパケットを送信していないか、他の何かをしているパケットを送信していませんか? パケットが宛先に到達しない場合に TCP を使用している場合 (ルーターまたはいずれかのデバイス上の接続の間のどこかでバッファーが他のパケットでいっぱいになっている場合)、パケットを再送信する必要があります。これは、設定が原因である可能性があります。あなたが私たちに与えてくれた小さな情報を考えると、私は次のアドバイスをすることができます:

より高度な類型を調べてください。これらのいずれも使用していないと仮定します。

受信スレッドを送信します。送信スレッドは、キューに入れたパケットをプッシュします。


|P| - プログラムの Que 部分に保持されたパケット

スレッドを送信します <-| ぴ | ぴ | ぴ | <-アプリ/プログラム

受け取る -> | ぴ | ぴ | P| P -> アプリ/プログラムがデータを取り出して分析する


送受信キューイング システムは互いに連携して動作するため、受信パケットと送信パケットを常にバッファリングしています。あなたのセットアップで起こっているように見えるのは(私が推測する限り)、最新のパケットを取得して分析するループがあることです。これは、ハードウェア (ネットワーク ハードウェアの一部) バッファーが、プログラムが他のことを行っているパケットでいっぱいになり、プログラムがそれらを収集するまでに、それらの一部が失われていることを意味します。これにより、一方が「これらのパケットを取得できませんでした。もう一度送信してください」という状態になります。つまり、キューから取り出されて分析されるのを待っているキューに吸い込まれるべきパケットを再送信します。キューは、プログラムがそのデータを取得してそれを処理するためにどれだけ速く戻ったかに関係なく、大きくなる可能性があります (もちろん、RAM に制限されています)。


別のアプローチは、ハンドシェイク システムを実行することです。プログラムの 1 つは、最後のパケットが送信され、受信され、もう一方の側が「クール、次のパケットを送ってください」となるまで待機します。これにより、ダウンロード/アップロード速度が遅くなりますが、パケットがバッファの 1 つの端から落ちるよりも少し速くなります (ルータなどの各ノードは、一度に処理できる以上のパケットが入ってきた場合に備えてパケットをバッファリングします)。サイクル) ネットワークで。


一方または両方の端で可能な場合は、ステート マシンを使用する必要があります。アプリがファイルをダウンロードしているときは、受信状態にロックして、同時に他のものを送受信しようとしないようにします。ダウンロードが完了したら、他の状態 (ファイルを開く状態など) に切り替えます。ステート マシンについてよく知らない場合は、wikipedia の記事を参照することをお勧めします。

http://en.wikipedia.org/wiki/Finite-state_machine

于 2012-06-22T19:24:01.903 に答える