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结束组合。

还可以根据文件类型,设定字节数组,比如文本文件,每行一百的都是足够的,如果是二进制文件,需要使用更长的数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容: IL代码分析方法 IL命令解析 .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力。俱往昔,我发现很多的园友都把…

android 获取服务对象,android 如何取得正在运行的service对象

在写有关推送的代码,用的长连接的方式。具体逻辑:登录时 启service,service中启一个线程,线程中构建一个CommunicateManegr对象,此对象里面有一个BlockingDeque双端队列处理包的顺序问题, 还有若干线程分别…

[你必须知道的.NET]第十五回:继承本质论

本文将介绍以下内容: 什么是继承?继承的实现本质1. 引言 关于继承,你是否驾熟就轻,关于继承,你是否了如指掌。 本文不讨论继承的基本概念,我们回归本质,从编译器运行的角度来揭示.NET继承中的…

海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位

摘要:海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙自创办以来,一直秉持“以市场为导向,以科…

[你必须知道的.NET]第十六回:深入浅出关键字---using全接触

本文将介绍以下内容: using指令的多种用法using语句在Dispose模式中的应用1. 引言 在.NET大家庭中,有不少的关键字承担了多种角色,例如new关键字就身兼数职,除了能够创建对象,在继承体系中隐藏基类成员,还在…

华为双系统是鸿蒙系统吗,华为p50pro是鸿蒙系统吗-华为p50pro有双系统吗

华为p50pro的外观基本上就是延续了上一代的风格,没有什么太大的变化,不过影像能力还是非常令人期待的,下面一起来了解华为p50pro的系统方面,看看有没有你暂所不知的消息。近日,有消息曝光了华为 P50 Pro将会有 Harmony…

[你必须知道的.NET]第十七回:貌合神离:覆写和重载

本文将介绍以下内容: 什么是覆写,什么是重载覆写与重载的区别覆写与重载在多态特性中的应用1. 引言 覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一,两…

鸿蒙系统正式开源,余承东:鸿蒙系统正式开源,友商也可以使用!

鸿蒙OS2.0正式开源:从PPT走向前台,该谁脸红了?在9月10日的开发者大会上,华为鸿蒙2.0发布,已经不再是某些人嘴中的PPT、又哄又蒙的鸿蒙了。说鸿蒙是PPT的言论,在前不久还能看到,如今鸿蒙已经发布…

[你必须知道的.NET]第十八回:对象创建始末(上)

本文将介绍以下内容: 对象的创建过程内存分配分析内存布局研究1. 引言 了解.NET的内存管理机制,首先应该从内存分配开始,也就是对象的创建环节。对象的创建,是个复杂的过程,主要包括内存分配和初始化两个环节。例如&…

viper4android fxifi,ViPer4android. FX顶级音效!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼名称:OPPO X903 杜比音效脉冲反馈样本 For VIPER4Android FX v2.0样本数量:72适配V4A版本:ViPER4Android FX v2.2.0.1 或更高适用范围:耳机内放制作者:漫游因特网授权&…

[你必须知道的.NET]第十九回:对象创建始末(下)

本文将介绍以下内容: 对象的创建过程内存分配分析内存布局研究接上回[第十八回:对象创建始末(上)],继续对对象创建话题的讨论>>> 2.2 托管堆的内存分配机制 引用类型的实例分配于托管堆上,而线…

android material 颜色值,Android Material Colors 谷歌 Material Design 标准颜色

Android Material Colors谷歌 Material Design 标准颜色。调色板资源文件通过 doc-getter 自动抓取生成。运行 Demo 来查看效果。UsageGradlecompile com.takwolf.android.materialdesign:color:0.0.1Stylecolor/material_indigo_500color/material_indigo_700color/material_p…

突然吐字不清_要注意说话吐字不清小心是脑中风前兆

任何疾病发病之前往往会有一些前兆出现,像是脑中风这种疾病在发作之前也是有前兆的,若是朋友们能够尽早的发现就能够在发病前进行治疗了。朋友们要注意的是说话吐字不清小心是脑中风前兆,这是脑中风发病前的典型前兆,还有头晕、呕…

[你必须知道的.NET]第二十回:学习方法论

本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件。 本文,其实早计划在《你必须知道的.NET》写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一。 本文,作为[《你必须知道的.NET》]系列的第20…

c++ vs release没有exe_未来安全 | 第一次Geant4培训总结 | 有没有你关注的问题呢?...

Geant4简介Geant4是蒙卡工具包,模拟很多粒子,记录一些统计量,用这些统计量去估计真实的物理实验的结果。蒙卡模拟程序,从最老的MCNP,到PENELOPE,FLUKA等。MCNP是用输入卡片(输入文件)实现的,在一…

[你必须知道的.NET]第二十一回:认识全面的null

说在,开篇之前 null、nullable、??运算符、null object模式,这些闪亮的概念在你眼前晃动,我们有理由相信“存在即合理”,事实上,null不光合理,而且重要。本文,从null的基本认知开始&#xff0…

html用表格做个人主页页面,利用HTML的表格进行页面布局

在DIVCSS布局出现前,基本上所用的网站都使用table来进行布局。因为table布局很简单,但是table布局不灵活且代码很多。下面将介绍怎样使用table来进行布局。实例:我们来布局一个常见网站后台程序的架构。布局图如下所示:实例代码&a…

cesium坡度坡向分析_景观设计分析图制作技巧到底是什么?

国外设计中,人们都开始用动态分析图啦厉害的不要不要啊!如果你也想做如此高逼格的分析图记得往下看!景观设计分析为:人文,背景,区位,现状,历史,功能,流线&…

采购模板html5,蓝色的采购信息管理系统手机界面wap模板

手机版大气信息管理系统界面模板,采购信息管理wap手机模板下载。资源下载此资源下载价格为4D币,请先登录资源文件列表codedown123-080801-25/business_log.html , 6657codedown123-080801-25/choose.html , 6869codedown123-080801-25/css/animate.css ,…

使用Linq时出现Row not found or changed. Linq 找不到行或行已更改的解决办法

在使用Linq的时候经常出现在了这样的一个错误 Row not found or changed. 找不到行或行已更改 解决方案。 首要的解决方案是,检查数据库字段定义,是否有不一致的地方,尤其是 该字段是否可空 Nullable 第一个简单的方案就是 打开dbml (linq)文…