android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用
上傳文件
開始想用apache的開源庫獲取文件,但是失敗了,要么文件不全,要么就完全為空,還是自己寫。
文件上傳請求頭的部分內(nèi)容
contentType:multipart/form-data; boundary=----WebKitFormBoundaryHpUAY0qCryu0Oc7o
我們需要獲取boundary 后面的數(shù)據(jù),主要作用是標識文件在流中的范圍。當然了,這個boundary是會變的,每次都要重新獲取。
請求頭之后就是發(fā)送的數(shù)據(jù)(以一個文件為例)
第一行
------WebKitFormBoundaryHpUAY0qCryu0Oc7o
第二行
Content-Disposition: form-data; name="file"; filename="ic_excel.xml" filename:ic_excel.xml
第三行
Content-Type: text/xml
第四行
\r\n\
倒數(shù)第四行\(zhòng)
\r\n
倒數(shù)第三行
------WebKitFormBoundaryHpUAY0qCryu0Oc7o
倒數(shù)第二行
ic_excel.xml\
倒數(shù)第一行\(zhòng)
------WebKitFormBoundaryHpUAY0qCryu0Oc7o--
也就是說我們需要按照行的方式來讀取,以免錯過這些boundary,又不能夠使用Java提供的readLine,在二進制文件幾乎沒有換行,我們的字節(jié)數(shù)組是盛不下一行的。
private LineData getLineData(InputStream inputStream, int capacity) {
byte[] bytes = new byte[capacity];
int index = 0;
try {
while (true) {
int current = inputStream.read();
if (current == '\r') {
//檢查下一個是否是\n
int next = inputStream.read();
bytes[index++] = (byte) current;
bytes[index++] = (byte) next;
if (next == '\n') {
//是\n,是一個crlf換行,退出循環(huán)
break;
} else if (next == -1) {
//因為是-1,所以退出while 不會添加換行,基本不會出現(xiàn)這種情況,可以根據(jù)自己需要拋出異常
index--;
break;
} //current 是正常的一個\r
} else if (current == -1) {//因為是-1,所以退出while 不會添加換行,基本不會出現(xiàn)這種情況,可以根據(jù)自己需要拋出異常
break;
} else
bytes[index++] = (byte) current;
if (index >= capacity - 1) {//不夠下一次的\r\n了
break;
}
}
return new LineData(bytes, index);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
static class LineData {
byte[] bytes;
String string;
int length;
LineData(byte[] bytes, int length) {
this.bytes = bytes;
this.string = new String(bytes, 0, length);
this.length = length;
}
}
最后一個boundary(倒數(shù)第三行)的上面是一個換行(還要注意哦,所有的換行都是\r\n),所以在我們不知道下一行是不是boundary時,是不可以貿(mào)然寫入文件的。
LineData lastLine = null;
while (true) {
LineData temp = getLineData(inputStream, capacity);
if (temp == null) {//出現(xiàn)異常
break;
}
if (temp.string.contains(first)) {
//上一行(lastLine)是crlf,這樣就沒有輸出這個內(nèi)容就退出了
break;
}
if (lastLine != null) {
bufferedOutputStream.write(lastLine.bytes, 0, lastLine.length);
}
lastLine = temp;
}
文件讀取完畢之后還要檢查后面的boundary,如果后面的內(nèi)容不是我們預期的那樣,這個文件基本就是錯誤的了。解決辦法將這幾行數(shù)據(jù)作為文件內(nèi)容,繼續(xù)讀取,知道下一組boundary結(jié)束組合。
還可以根據(jù)文件類型,設定字節(jié)數(shù)組,比如文本文件,每行一百的都是足夠的,如果是二進制文件,需要使用更長的數(shù)組。
總結(jié)
以上是生活随笔為你收集整理的android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国14亿人,消费能力不如美国3亿人?我
- 下一篇: 申请信用卡的年龄限制为多少岁 信用卡申请