最終的なサイズがわからないチャンクでデータを送信することも、Apache ライブラリを使用すると非常に簡単です。簡単な例を次に示します。
DataInputStream dis;
...
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://localhost:8080");
BasicHttpEntity entity = new BasicHttpEntity();
entity.setChunked(true);
entity.setContentLength(-1);
entity.setContent(dis);
httppost.setEntity(entity);
HttpResponse response = null;
try {
response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO
} catch (IOException e) {
// TODO
}
...
// processing http response....
dis
エンティティ本体を含むストリームです。パイプdis
されたストリームを使用して、入力ストリームを出力ストリームにパイプできます。したがって、1 つのスレッドがデータを作成し (たとえば、マイクからの音声を録音する)、もう 1 つのスレッドがそれをサーバーに送信する場合があります。
// creating piped streams
private PipedInputStream pis;
private PipedOutputStream pos;
private DataOutputStream dos;
private DataInputStream dis;
...
pos = new PipedOutputStream();
pis = new PipedInputStream(pos);
dos = new DataOutputStream(pos);
dis = new DataInputStream(pis);
// in thread creating data dynamically
try {
// writing data to dos stream
...
dos.write(b);
...
} catch (IOException e) {
// TODO
}
// Before finishing thread, we have to flush and close dos stream
// then dis stream will know that all data have been written and will finish
// streaming data to server.
try {
dos.flush();
dos.close();
} catch (Exception e) {
// TODO
}
dos
データを動的に作成するスレッドdis
、サーバーにデータを送信するスレッドに渡す必要があります。
参照: http://www.androidadb.com/class/ba/BasicHttpEntity.html