日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用

發(fā)布時(shí)間:2023/12/10 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上傳文件

開始想用apache的開源庫(kù)獲取文件,但是失敗了,要么文件不全,要么就完全為空,還是自己寫。

文件上傳請(qǐng)求頭的部分內(nèi)容

contentType:multipart/form-data; boundary=----WebKitFormBoundaryHpUAY0qCryu0Oc7o

我們需要獲取boundary 后面的數(shù)據(jù),主要作用是標(biāo)識(shí)文件在流中的范圍。當(dāng)然了,這個(gè)boundary是會(huì)變的,每次都要重新獲取。

請(qǐng)求頭之后就是發(fā)送的數(shù)據(jù)(以一個(gè)文件為例)

第一行

------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--

也就是說我們需要按照行的方式來讀取,以免錯(cuò)過這些boundary,又不能夠使用Java提供的readLine,在二進(jìn)制文件幾乎沒有換行,我們的字節(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') {

//檢查下一個(gè)是否是\n

int next = inputStream.read();

bytes[index++] = (byte) current;

bytes[index++] = (byte) next;

if (next == '\n') {

//是\n,是一個(gè)crlf換行,退出循環(huán)

break;

} else if (next == -1) {

//因?yàn)槭?1,所以退出while 不會(huì)添加換行,基本不會(huì)出現(xiàn)這種情況,可以根據(jù)自己需要拋出異常

index--;

break;

} //current 是正常的一個(gè)\r

} else if (current == -1) {//因?yàn)槭?1,所以退出while 不會(huì)添加換行,基本不會(huì)出現(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;

}

}

最后一個(gè)boundary(倒數(shù)第三行)的上面是一個(gè)換行(還要注意哦,所有的換行都是\r\n),所以在我們不知道下一行是不是boundary時(shí),是不可以貿(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,這樣就沒有輸出這個(gè)內(nèi)容就退出了

break;

}

if (lastLine != null) {

bufferedOutputStream.write(lastLine.bytes, 0, lastLine.length);

}

lastLine = temp;

}

文件讀取完畢之后還要檢查后面的boundary,如果后面的內(nèi)容不是我們預(yù)期的那樣,這個(gè)文件基本就是錯(cuò)誤的了。解決辦法將這幾行數(shù)據(jù)作為文件內(nèi)容,繼續(xù)讀取,知道下一組boundary結(jié)束組合。

還可以根據(jù)文件類型,設(shè)定字節(jié)數(shù)組,比如文本文件,每行一百的都是足夠的,如果是二進(jìn)制文件,需要使用更長(zhǎng)的數(shù)組。

總結(jié)

以上是生活随笔為你收集整理的android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。