1

httpソケットプログラムを使用して、Androidデバイスから別のデバイスにファイルを送信するアプリケーションを作成しています。これがコードです、サーバー側

try {
            ServerSocket servsock = new ServerSocket(4042);
            File myFile = new File(pathToFile);
            while (true) {
                Socket sock = servsock.accept();
                byte[] mybytearray = new byte[(int) myFile.length()];
                BufferedInputStream bis = new BufferedInputStream(
                        new FileInputStream(myFile));
                bis.read(mybytearray, 0, mybytearray.length);
                OutputStream os = sock.getOutputStream();
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();
                bis.close();
                sock.close();

            }
        } catch (Exception e) {
            Toast.makeText(MyActivity.context,
                    "Failed to send file!", Toast.LENGTH_SHORT)
                    .show();
        }

そしてクライアント側は、

try {
                Socket sock = new Socket(ipAddress, 4042);
                byte[] mybytearray = new byte[1024];
                InputStream is = sock.getInputStream();
                FileOutputStream fos = new FileOutputStream("/mnt/sdcard/"
                        +fileName);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = is.read(mybytearray, 0, mybytearray.length);
                bos.write(mybytearray, 0, bytesRead);
                bos.close();
                sock.close();
            } catch (Exception e) {
                Toast.makeText(MyActivity.context,
                        "Failed to download the file!", Toast.LENGTH_LONG)
                        .show();
            }

これらのコードは両方とも AsyncTask クラスにあります。しかし、クライアント側は常にタイムアウトしています。これは、Android でインターネット経由でファイルを転送する正しい方法ですか? もしそうなら、私が間違っているところを教えてください。前もって感謝します。

編集:ここでは、ファイルをサーバー側で送信する必要があり、クライアントはそのファイルをダウンロードしようとしています。

4

1 に答える 1

1

サーバー側のコード:

byte[] mybytearray = new byte[(int) myFile.length()];

myFile が宛先であり、それを作成したばかり (ファイルがまだ存在しないことを意味する) の場合、 myFile.length() は 0 になります。つまり、サイズ 0 のバッファーを作成し、0 バイトを読み取ります。

サーバーは、ソケットから読み取るデータの量を知る必要があります。回避策は、Android アプリが最初にファイルの長さを書き込み、サーバーがそれを読み取り、それに応じてバッファーを作成し、その後完全なファイルを書き込むことです。.close()また、呼び出しを finally ブロックに移動することをお勧めします。

または、たとえば、Android でApache FTP クライアントを使用し、サーバー側でお気に入りの FTP サーバーを使用することもできます。

于 2012-12-17T07:23:27.513 に答える