我想在创建整个数据之前开始向HTTP服务器发送数据。
使用java.net.HttpURLConnection时非常容易:
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
dos = new DataOutputStream(urlConnection.getOutputStream());
...
dos.writeShort(s);
...
但由于某些原因我想用org.apache.http包来做(我必须开发一个基于包org.apache.http的库)。我已阅读其文档,但我没有找到与上面代码类似的任何内容。在知道最终数据大小之前,是否可以使用org.apache.http软件包将数据发送到HTTP服务器?
提前感谢所有建议;)
答案 0 :(得分:2)
使用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
输入流与输出流进行管道连接。因此,一个线程可能正在创建数据(例如,从麦克风录制声音),另一个可能会将其发送到服务器。
// 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