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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

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

上傳文件

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

文件上傳請求頭的部分內容

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

我們需要獲取boundary 后面的數據,主要作用是標識文件在流中的范圍。當然了,這個boundary是會變的,每次都要重新獲取。

請求頭之后就是發送的數據(以一個文件為例)

第一行

------WebKitFormBoundaryHpUAY0qCryu0Oc7o

第二行

Content-Disposition: form-data; name="file"; filename="ic_excel.xml" filename:ic_excel.xml

第三行

Content-Type: text/xml

第四行

\r\n\

倒數第四行\

\r\n

倒數第三行

------WebKitFormBoundaryHpUAY0qCryu0Oc7o

倒數第二行

ic_excel.xml\

倒數第一行\

------WebKitFormBoundaryHpUAY0qCryu0Oc7o--

也就是說我們需要按照行的方式來讀取,以免錯過這些boundary,又不能夠使用Java提供的readLine,在二進制文件幾乎沒有換行,我們的字節數組是盛不下一行的。

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換行,退出循環

break;

} else if (next == -1) {

//因為是-1,所以退出while 不會添加換行,基本不會出現這種情況,可以根據自己需要拋出異常

index--;

break;

} //current 是正常的一個\r

} else if (current == -1) {//因為是-1,所以退出while 不會添加換行,基本不會出現這種情況,可以根據自己需要拋出異常

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(倒數第三行)的上面是一個換行(還要注意哦,所有的換行都是\r\n),所以在我們不知道下一行是不是boundary時,是不可以貿然寫入文件的。

LineData lastLine = null;

while (true) {

LineData temp = getLineData(inputStream, capacity);

if (temp == null) {//出現異常

break;

}

if (temp.string.contains(first)) {

//上一行(lastLine)是crlf,這樣就沒有輸出這個內容就退出了

break;

}

if (lastLine != null) {

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

}

lastLine = temp;

}

文件讀取完畢之后還要檢查后面的boundary,如果后面的內容不是我們預期的那樣,這個文件基本就是錯誤的了。解決辦法將這幾行數據作為文件內容,繼續讀取,知道下一組boundary結束組合。

還可以根據文件類型,設定字節數組,比如文本文件,每行一百的都是足夠的,如果是二進制文件,需要使用更長的數組。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。