2016-08-04 12 views
0

私は同様の質問があることを知っていますが、私の問題には適していません。私はAndroidデバイス(API 15 - Androidバージョン4.0.4)とLinux Linuxを実行しているLinuxマシンを持っています。私はファイルを交換できるように、サーバー(Cプログラム)とクライアント(Androidアプリ)との間に接続を作成することを考えました。また、サーバーはパラレル接続をサポートしており、認証が必要です。アンドロイドアプリは、3つの異なるポートを使用して3つのAsyncTaskがマルチスレッドで動作するように、サーバーとの3つの接続を作成する必要があります。そのうち2つは並列バックグラウンドプロセス用で、1つは実際のファイル転送用です。エミュレータ(Android KitKat OS)でうまく動作するコードを作成しましたが、自分の携帯電話でテストすると機能しません。私は自分のコードを掲示し、もし可能であれば、あなたからアドバイスをしたいと思います。ありがとう。Java(Androidクライアント)とC(PCサーバー - Linux)の間のファイル転送にTCPを使用する

これはAndroid搭載端末で実行されているコードです... BUFFSIZE は1024であり、グローバル変数です。 私はそれを多くの値に設定しようとしましたが、どれも私のために働いていませんでした。ファイルサイズは、私はこのコードをテストしている、以前のコードで設定されていると常に正しい値がそう:)それについて

InputStream is = socket.getInputStream(); 
FileOutputStream fs = new FileOutputStream(target); 

int u; 
byte[] jj = new byte[BUFFSIZE]; 
long overall = 0, percent = 0; 

try { 

    while (overall < filesize && mRun) { 
      u = is.read(jj, 0, BUFFSIZE); 
      if (u == -1) break; 
      fs.write(jj, 0, u); 
      overall += u; 
      percent = overall*100/filesize; 
    } 

    fs.flush(); 
    fs.close(); 
    is.close(); 
    socket.close(); 

} catch (IOException ex) { 
    // There were no exceptions while testing 
    // There is some code here that deals with the UI 
    // which is not important 
} 

を心配しないで、これはCコードですが...

for (;;) 
    { 
     /* First read file in chunks of BUF_SIZE bytes */ 
     unsigned char buff[BUFFER]={0}; 
     int nread = fread(buffer,1,BUFFER, input); 
     printf("Bytes read %d \n", nread); 

     /* If read was success, send data. */ 
     if(nread > 0) 
     { 
      printf("Sending \n"); 
      write(sockfd, buffer, nread); 
     } 

     /* 
     * There is something tricky going on with read .. 
     * Either there was error, or we reached end of file. 
     */ 
     if (nread < BUFFER) 
     { 
      if (feof(input)) 
       printf("End of file\n"); 
      if (ferror(input)) 
       printf("Error reading\n"); 
      break; 
     } 
    } 

何度も、telnetを使っていてもかなりうまくいきました。しかし、Javaコードについてはわかりません。

なぜ、どうしてうまくいかないのですか?さて、私が知っていることは、いくつかのファイルが壊れていることです。私が4MBのサイズのmp3ファイルを転送すると、3.99が送信され、静止している0.01がファイルの途中でどこかで失われてしまうということを言いましょう!破損したmp3を再生すると、一部のパーツ(10秒ごとなど)が「オフビート」になることがわかります。スキップされた小さなノイズがある場合と同様です。結果のファイルは元のファイルサイズよりも約10 000バイト短くなります(ただし、実際のファイルサイズに依存します)。ファイルの小さな部分は常に失われます。つまり、whileループは決して終了しません。ソケットはブロックされていて、クライアントは決して受信されないより多くのバイトを待つことになります)。私が考えているのは、1,024バイトのバッファから、1024バイトのバッファサイズは24バイトの損失につながります。私はこれらが実際の数字だと言っているわけではありませんが、それは私の頭の中で起こっていることです。私はこれについて間違っている可能性が高いです。本当に長いので、コード全体を共有することはできませんでした。そのため、ダウンロードプロセスを扱う関数を使用することにしました。

答えて

0

readメソッドがバッファ全体を満たしていないことは全く問題ありません。このメソッドは、読み取られたバイト数を返します。

u = is.read(jj, 0, BUFFSIZE); 

しかし u読み込みを中止したときに見つけるために -1であるならば、あなただけのチェック:あなたも変数にその値を割り当てます。ドキュメントから:あなたのバイト配列が1024バイトの最大長さを有することを意味する

The number of bytes actually read is returned as an integer. 

ではなく、それらのすべては、各readで入力されます。もちろん、そうでない場合は、入力ストリームに1024バイトの倍数が含まれている場合にのみ動作します。

また、debuggingと呼ばれるものがあります。 mp3ファイルなどのバイナリデータを調べるのは難しいかもしれないので、テキストファイルを送信しながらデバッグを試みてください。

+0

はい、なぜ私のファイルが受信されませんでしたか?テキストファイルとそれをデバッグするとうまく動作します。これは、いくらか大きなファイルでは失敗します。それは時々数バイトをスキップします。これがファイル全体であるとしよう.123と5を読み取る。数字4をスキップし、ファイル全体の最後に来ると、より多くのバイトが読み込まれることを期待しているため、ファイルがハングするもう1つは正確です - 番号4)..これは大きなファイルで起こり、実際の問題がどこにあるのかわかりません。 – user3752782

関連する問題