3

編集*クライアントサーバーで成功しました。現在、2つのエミュレーター間でファイル転送を行っています。ファイルはエミュレータ間で転送されましたが、受け取ったファイルサイズが元のファイルと同じではないことに気付きました。たとえば、A.jpgのサイズは900KBですが、受信したファイルは900KB未満です。ファイル転送サイズを確認したところ、転送時にデータ(バイト)が失われていることがわかりました。これはどのように起こっていますか?

コードは次のとおりです。

クライアント(ファイルの送信)

File myFile = new File ("/mnt/sdcard/Pictures/A.jpg");
FileInputStream fis = new FileInputStream(myFile);
OutputStream os = socket.getOutputStream();
int filesize = (int) myFile.length();

byte [] buffer  = new byte [filesize];
     int bytesRead =0;
     while ((bytesRead = fis.read(buffer)) > 0) {
     os.write(buffer, 0, bytesRead);
//Log display exact the file size
     System.out.println("SO sendFile" + bytesRead);
     }
     os.flush();
     os.close();
     fis.close();
     Log.d("Client", "Client sent message");
     socket.close();

サーバー(ファイルの受信)

FileOutputStream fos = new FileOutputStream("/mnt/sdcard/Pictures/B.jpg");
@SuppressWarnings("resource")
BufferedOutputStream bos = new BufferedOutputStream(fos);
InputStream is = clientSocket.getInputStream();

byte[] aByte = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(aByte)) != -1) 
{
     bos.write(aByte, 0, bytesRead);
//Log display few parts the file size is less than 1024. I total up, the lost size caused the file received is incomplete
     System.out.println("SO sendFile" + bytesRead);
 }
clientSocket.close();

*編集2

グーグルをサーフィンしていると、.read(buffer)がファイルのフルサイズ(byte)を読み取ることを保証しないことがわかりました。したがって、受信したファイルは常に数バイト(スペース、空の文字など)を失いました。これを解決するには、最初にファイルサイズを送信して受信者に通知してから、ファイルの転送のみを開始します。

4

3 に答える 3

1

NetworkOnMainThreadExceptionAsyncTask を使用する必要があるために発生します

NullPointerExceptionPrintWriterSockets の結果で使用しようとしているために発生します。ソケットに何も持っていないため、このエラーが発生します。

于 2012-12-31T07:20:08.803 に答える
0

Android のメイン スレッドでサーバー操作を呼び出すことはできません。Android OS 4.0 以降では、これによりNetworkOnMainThreadExceptionが直接発生します。2 つの選択肢があります。

1)AsyncTaskを使用してすべてのサーバー操作を呼び出すか。

2)または、任意のタイプのサーバー操作にユーザー定義スレッドを使用します。

私もこの例外に苦労していました, 4.0以上のデバイスのOSバージョンでのみ, Androidのこれらの小さなニーズを無視することはできません.

于 2012-12-31T07:24:56.010 に答える
0

NetworkOnMainThreadException、あなたが間違っていることを教えてくれます。

AsyncTaskネットワークのものを別のスレッド(または同様のもの)に入れる必要があります。

于 2012-12-31T07:15:35.467 に答える