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服务器应用相关推荐
- 服务器如何做中转进行端口映射,使服务器之间通信,然后访问目标网站(baidu.com)
文章目录 服务器如何做中转进行端口映射,使服务器之间通信,然后访问目标网站(baidu.com) 问题缘由 所需环境 操作步骤 1. 目的服务器设置 2. 中间服务器设置 3. 修改客户端 总结 服务 ...
- 【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP
目录 第一部分.前言 1.目标效果 2.准备知识 第二部分.详细步骤 1.新建Empty工程 2.添加资源文件 3.搭建注册界面 4.搭建登录界面 5.编写注册界面和登录界面的代码 6.设置APP初 ...
- android countdowntimer 格式化,Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器...
// CountDownUtil import android.os.CountDownTimer; public class CountDownUtil { /** * 倒计时结束的回调接口 */ ...
- android 心形上漂动画,PowerPoint Viewer制作一个漂亮心形飞出动画的操作教程
各位使用PowerPoint Viewer的同学们,你们知道怎么制作一个漂亮心形飞出动画吗?在这篇教程内小编就为各位呈现了PowerPoint Viewer制作一个漂亮心形飞出动画的操作教程. Pow ...
- 服务器怎么做无盘系统,如何用云服务器做无盘系统
如何用云服务器做无盘系统 内容精选 换一换 如果创建私有镜像所使用的原云服务器挂载了多个数据盘,可能导致由私有镜像创建的新云服务器无法使用.因此在创建私有镜像前,需要卸载原云服务器中挂载的所有数据盘. ...
- 亚马逊服务器怎么做系统,使用亚马逊云服务器EC2做深度学习(四)配置好的系统镜像...
这是<使用亚马逊云服务器EC2做深度学习>系列的第四篇文章. 配置深度学习的环境是一个非常繁琐的过程.它要求你对Linux命令有一定地了解,与此同时各种深度学习库.驱动更新十分频繁,有可能 ...
- ai怎么做盒子效果图_AI制作一个漂亮的3D立体质感标志
这篇教程教脚本之家的朋友们用AI制作一个漂亮的3D立体质感标志方法,教程绘制的效果图很漂亮绘制的难度中等,教程中同时还是用PS做了简单的处理.转发过来和脚本之家的AI爱好者们一起学习这个标志的绘制.希 ...
- php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器
在Linux中搭建一个ftp服务器,以供两个工作小组保管文件使用.禁用匿名.第一个小组使用ftp账号:ftp1,工作目录在:/var/ftp/ftp1:第二个小组使用ftp2,工作目录在:/var/f ...
- java服务器和linux_在Linux下开一个Java服务器(使用CatServer Pro)
引言 Linux开服具有快速,高效,性能等特点,而Windows虽然简单,但是不具备Linux良好的性能. 本教程就说明一下简单的Linux开服方式(@需要教程的人,如果你学会后,请无偿帮助更多的人. ...
- RED5流媒体服务器作为客户端转发流至另一个RED5服务器
RED5流媒体服务器,是Java开源的实现RTMP协议的服务器.有关RTMP协议,网上有很多的介绍.现在着重介绍一下,客户端连接RED5服务器的开发流程. RED5有一个client包red-clie ...
最新文章
- P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐
- chapter13 机器学习之利用PCA简化数据
- JQuery绑定事件 时如何传递参数
- 均值极差图控制上下限_年度质量回顾-单值移动极差
- 斐波那契java编写_请编写一个Java程序的斐波那契数
- Windows平台下搭建Git服务器的图文教程
- 2008-2019年高等学校科技统计资料汇编
- 关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)的一些笔记
- 声音存储空间计算公式_声音文件存储量的计算公式
- 【音乐】后弦 - 笔墨侍候
- Zookeeper隐藏通道和羊群效应
- 快递100显示查询错误?快递100快递查询类FAQ
- 小白学语句:省市区选择(带全国省市区数据)
- Nature:16年前的论文生成软件SCIgen至今仍有人用,骗过同行评审,论文被接收...
- Fastadmin 阿里云Oss插件的配置
- UI必备 PS圆角Corner Editor插件
- Linux服务 httpd
- Fragment has not been attached yet 解决方法及源码详解
- docker异常--docker bind: cannot assign requested address.
- application.yml 要有如下图图标,否则启动有问题
热门文章
- (转载)ubuntu开启SSH服务
- Mysql数据库的几大优势
- String ... String 三个点 jdk1.5的特性.才知道
- GPLT2017题目
- 图论中的基础概念总结
- 西北民族大学c语言程序设计复试科目,2016年西北民族大学中国民族信息技术研究院962C语言程序设计复试笔试仿真模拟题...
- ihtml2document能不能根据id获取dom_一段监视 DOM 的神奇代码
- java 4个系统,JSP系统的四个组成部分
- redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
- 1555C. Coin Rows