多看Android版本WIFI传书的实现
来源:互联网 发布:有关网络的名言 编辑:程序博客网 时间:2024/05/27 20:23
多看Android版本WIFI传书的实现
参照《多看》的WIFI传书功能
* 手机端的HttpServer采用开源项目AndroidAsync实现的。
* 网页端采用jQuery实现,文件上传采用Upload5(HTML5浏览器)和ajaxupload.js(非HTML5浏览器,如IE7/IE8/IE9)
手机端截图
网页版截图
AndroidAsync HttpServer技术要点
AndroidAsync针对HTTP Servers模块的文档介绍非常少,需要大家自己去看源码。本项目中HTTP server功能都在WebService.java这个文件中。下面简单说一下本项目中用到一些传输API:
* 获取x-www-form-urlencoded请求体
UrlEncodedFormBody body = (UrlEncodedFormBody) request.getBody();
- 获取multipart/form-data请求体
MultipartFormDataBody body = (MultipartFormDataBody) request.getBody()
- 发送文本
response.send("Hello world!");
- 发送文件流
BufferedInputStream bInputStream = ...response.sendStream(bInputStream, bInputStream.available());response.sendFile(...);
- 发送Json
response.send(new JSONObject());
- 发送Header
response.getHeaders().add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "utf-8"));
- 发送特定的响应码
response.code(500);//这个一定要和send()或者end()一起使用
WIFI传输 HttpServer文件上传功能实现
server.post("/files", (AsyncHttpServerRequest request, AsyncHttpServerResponse response) -> { final MultipartFormDataBody body = (MultipartFormDataBody) request.getBody(); body.setMultipartCallback((Part part) -> { if (part.isFile()) { body.setDataCallback((DataEmitter emitter, ByteBufferList bb) -> { fileUploadHolder.write(bb.getAllByteArray()); bb.recycle(); }); } else { if (body.getDataCallback() == null) { body.setDataCallback((DataEmitter emitter, ByteBufferList bb) -> { try { String fileName = URLDecoder.decode(new String(bb.getAllByteArray()), "UTF-8"); fileUploadHolder.setFileName(fileName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } bb.recycle(); }); } } }); request.setEndCallback((Exception e) -> { fileUploadHolder.reset(); response.end(); RxBus.get().post(Constants.RxBusEventType.LOAD_BOOK_LIST, 0); }); } );
- 这里上传有2个Part:一个文件名,另一个是文件内容。之所以用有文件名Part是为了支持中文文件名:在multipart/form-data上传文件所存的中文文件名会因为AndroidAsync采用ASCII编码导致乱码。因此新增一个文件名Part,内容是网页端JS对文件名进行encodeURL,Server端拿到后再URLDecoder.decode得到中文文件名。
- 这里涉及3个Callback:MultipartCallback、DataCallback和CompletedCallback。AndroidAsync采用NIO,处理请求体时候:每处理一个新的Part会回调MultipartCallback;通过多次回调DataCallback来接收文件内容;处理完所有的请求体回调CompletedCallback表示请求数据都已接收完毕,可以向客户端发送响应,如response.end()结束请求。
TODO
因AndroidAsync采用NIO,目前还不知道怎么获取上传文件的大小。在使用非HTML5浏览器(如IE7/IE8/IE9)时候,文件上传进度无法正确显示。
奉上源码
https://github.com/baidusoso/WifiTransfer
版权声明
本项目参考《多看》实现的,网页端的资源于《多看》并稍作修改,不得用于任何商业用途,仅供学习研究使用,否则后果自负。
1 0
- 多看Android版本WIFI传书的实现
- android 系统基于wifi 定位的实现
- Android简单的Wifi语音对讲实现
- Android 简单的实现WIFI连接
- Android开发--WIFI实现
- Android开发--WIFI实现
- Android开发--WIFI实现
- Android开发-WIFI实现
- Android开发--WIFI实现
- Android开发--WIFI实现
- Android开发--WIFI实现
- Android 版本更新的实现
- android 版本更新的实现
- 一个在线看android系统各个版本源码的链接
- android wifi 移植(加注版本)
- Android WiFi自动连接的优先级的实现情况 M
- Wifi电话的实现
- android系统版本介绍,还有可爱的版本代号 ,给安卓开发者看的,
- 熵 相对熵 交叉熵
- 深度学习(三十五)异构计算GLSL学习笔记(1)
- 你还在用第三方开源下拉刷新控件吗?试试google自带的下拉刷新控件SwipeRefreshLayout
- [CodeVersion--GIT]git ignore写法与使用规则
- 调取手机电话 调取视频聊天 html5调用手机摄像头
- 多看Android版本WIFI传书的实现
- Axure学习——如何制作页面滑动效果
- 深度学习(三十六)异构计算CUDA学习笔记(1)
- HTTP/Apache 错误代码汇总
- 安卓 代码的混淆
- Java---当由Maven搭建的Web项目报java.lang.ClassNotFoundException: org.springframework.web异常
- KNN最近邻算法
- 为RecyclerView添加分页加载(上拉加载更多)功能
- 深度学习(三十七)优化求解系列之(1)简单理解梯度下降