接收和發送大量數據
受限於手機的連網性能,我們無法實現一次性的發送大量數據(如圖片的發送和接收),因此必須實現數據的分段接收和發送.
例子:
客戶端採用http,服務器用php編寫
1.接收數據
涉及到服務器和客戶端的編碼方式問題,若只傳送字節流,不做任何的編解碼操作,則可有效的避免這一問題.一次接收數據的流程:
客戶端發送讀取數據請求-->服務器返回數據的段數-->客戶端讀取第一段-->客戶端讀取第二段......-->讀取完成,客戶端處理數據.
2.發送數據
發送數據的流程正好跟接收數據相反.
發送數據時採用post,模擬pc上上傳文件的方法
一次發送代碼
HttpConnection hc = null;
InputStream is = null;
String agent = "Profile/MIDP-1.0 Configuration/CLDC-1.0";
String type = "multipart/form-data;" + "boundary=" + BOUNDARY; //模擬form 發送
byte result[] = null;
try {
hc = (HttpConnection) Connector.open(url);
hc.setRequestMethod(HttpConnection.POST);
hc.setRequestProperty("User-Agent", agent);
hc.setRequestProperty("Content-Type", type);
hc.setRequestProperty("Content-Length", new Integer(rawData.length()).toString());
OutputStream os = hc.openOutputStream();
os.write(rawData.getBytes());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
is = hc.openDataInputStream();
int ch;
while ((ch = is.read()) != -1) {
baos.write(ch);
}
result = baos.toByteArray();
baos.close();
} catch (Exception e) {
e.printStackTrace();
result = null;
throw e;
} finally {
try {
if (is != null) {
is.close();
is = null;
}
if (hc != null) {
hc.close();
hc = null;
}
} catch (Exception e) {
e.printStackTrace();
result = null;
throw e;
}
}
return result;
rawdata 爲發送的數據,其組成方式爲
分隔符號
項目
分隔符號
項目
分隔符號
.
.
.
.
分隔符號可隨機生成,每一項用分隔符號分隔,用戶可任意向裏面添加項目.
--7d4a6d158c9
Content-Disposition: form-data; name="offset" //此次傳送的數據在整個文件中的下標
6144
--7d4a6d158c9
Content-Disposition: form-data; name="length"//此次傳送的數據長度
444
--7d4a6d158c9
Content-Disposition: form-data; name="total" //總的數據長度
6588
--7d4a6d158c9
Content-Disposition: form-data; name="format"
jpg
--7d4a6d158c9
Content-Disposition: form-data; name="file"; filename="camare.jpg" //文件名可任意寫
鯻q}魁碩08]t刊檍?x凗侜W?? //發送的數據段
--7d4a6d158c9--