3
static void sendFile(Socket socket, File file) throws IOException {

    File testFile = new File( Environment.getExternalStorageDirectory().toString()+"/DCIM/Camera/Test.jpg");
    byte [] buffer = new byte[(int)testFile.length()];
    FileInputStream fis = new FileInputStream(testFile);
    BufferedInputStream bis = new BufferedInputStream(fis);
    Log.d(DebugTag, "Trying to read testFile from storage into buffer");
    bis.read(buffer,0,buffer.length); 
    Log.d(DebugTag, "Read testFile into buffer");
    OutputStream os = socket.getOutputStream();
    Log.d(DebugTag, "Trying to write testFile from buffer into output stream");
    os.write(buffer, 0, buffer.length);
    Log.d(DebugTag, "Wrote testFile from buffer into output stream");
    os.flush();
    Log.d(DebugTag, "Outputstream flushed");
}

static void receiveFile(Socket socket) throws IOException {

    InputStream is = socket.getInputStream();
    String receivedFileDirectory = Environment.getExternalStorageDirectory().toString()+"/Pictures/receivedFile.jpg";
    File receivedFile = new File(receivedFileDirectory);
    //check if directory exists, otherwise create it
    if (receivedFile.exists()) {
        Log.d(DebugTag, "Filename at destination already exists");
    } else if (!receivedFile.exists()) {
        Log.d(DebugTag, "Filename at destination does not exist, trying to create it!");
        receivedFile.createNewFile();
        Log.d(DebugTag, "Created file!");
    }

    Log.d(DebugTag, "Preparing file reception. Destination:"+receivedFileDirectory);
    OutputStream os = new FileOutputStream(receivedFileDirectory);
    Log.d(DebugTag, "established outputstream to file directory");
    byte[] buffer = new byte[2048];
    int length;
    Log.d(DebugTag, "Trying to read inputstream into buffer and write file to destination");
    while ((length = is.read(buffer)) >0 ) {
        os.write(buffer,0,length);
    }
    Log.d(DebugTag, "File received.");
    os.flush();
    os.close();
    is.close();
    Log.d(DebugTag, "Closed in and out streams");

}

送信者ファイルは完全に機能しているようです。「出力ストリームがフラッシュされる」まで、すべてのログメッセージを取得します。受信側では、コードが while ループに到達するまで、すべてがうまくいっているように見えます。最後に取得するログ メッセージは常に「入力ストリームをバッファに読み込み、ファイルを宛先に書き込もうとしています」ですが、「ファイルを受信しました」と次のメッセージではありません。 . 奇妙なことに、テストファイルを受け取って開くことができます(ただし、数秒かかります-これがAndroidの一般的なものかどうかはわかりません)。 コードが while ループで動かなくなる理由は何か?

2 番目の質問:これは私の最初の Android/Java アプリです。このコードは、ソケットを介してファイルを送受信するのに問題ありませんか? ファイルが大きくなっても (最大 100MB まで)?

前もって感謝します!

4

1 に答える 1

2

is.read(buffer)接続の反対側が正常に閉じられている (またはエラーで例外がスローされている) 場合にのみゼロが返されるため、送信側で不足しているのはsocket.close().

os.flush()TCP はデータの送信がいつ完了したかを知らないため、ここでは十分ではありません。

于 2012-07-16T00:08:35.450 に答える