2011-01-08 15 views
6

私は、サーバーに画像を送信しようとしているAndroidアプリケーションを持っています。私はBase64エンコーディングを使ってこれを行いましたが、それは非常にうまくいったのですが、送信する前にピクチャをエンコードするにはあまりにも多くのメモリ(および時間)がかかりました。Java/Android:ソケット上のバイト配列の読み取り/書き込み

私はAndroidアプリケーションを単にバイト配列を送信する場所まで切り離そうとしていますが、あらゆる種類のエンコーディングスキームで回避するのではなく、できるだけ多くのメモリとCPUサイクルを節約します。サーバはJavaで書かれている

public String sendPicture(byte[] picture, String address) { 
    try { 
     Socket clientSocket = new Socket(address, 8000); 
     OutputStream out = clientSocket.getOutputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     out.write(picture); 
     return in.readLine(); 
    } 
    catch(IOException ioe) { 
     Log.v("test", ioe.getMessage()); 
    } 
    return " "; 
} 

これは私がAndroidのコードは次のようになりたいものです。正確に同じバイト配列を正しく取得できるように、サーバーコードをどのように記述すればよいですか?私の目標は、できるだけ多くのCPUサイクルをAndroidに保存することです。

私が試したすべての方法では、データが破損したり、例外がスローされたりしています。

ご協力いただければ幸いです。

答えて

2

ロバートとザキのコメントに基づいて、ここでは改善されたコードを修正しました。

public byte[] getPicture(InputStream in) { 
    try { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte[] data = new byte[1024]; 
    int length = 0; 
    while ((length = in.read(data))!=-1) { 
     out.write(data,0,length); 
    } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
    //handle it 
    } 
    return null; 
} 
3

このような何か試してください:あなたは双方向通信をしたい場合は、準備が整ったら、サーバが知っている必要があります

public byte[] getPicture(InputStream in) { 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     int data; 
     while ((data = in.read())>=0) { 
      out.write(data); 
     } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
     //handle it 
    } 
    return new byte[]{}; 
} 
+0

ストリームからバイト単位で読み込みを行うのは完全に非効率的で遅いです。一度に少なくとも1024バイトを読み込むほうがよい。 – Robert

+0

私は新しいバイト[] {}の代わりにnullを返すのが良いアイデアだろうと思います。 – Zaki

0

を - あなたはの数を示す、あなたの送信側に4バイトの長さフィールドを付加しなければなりませんバイトが来る。

サーバー側では、長さを読み取り、すべてが到着するまで待機します。それからあなたは肯定応答文字列を返信することができます。

画像のみを送信するだけであれば、データを送信してから接続を閉じることができます。サーバー側は@thejhのように実装されています。

関連する問題