NanoHttpd

NanoHttpd是个很强大的开源库,仅仅用一个Java类,就实现了一个轻量级的 Web Server,可以非常方便地集成到Android应用中去,让你的App支持 HTTP GET, POST, PUT, HEAD 和 DELETE 请求。

为了演示它的功能,我利用该库搭建了一个简单地Android视频服务器,可以通过PC浏览器远程播放Android手机存储器中的mp4视频文件。

1. Demo效果

左边是手机端App界面,右边是在电脑的浏览器中远程播放手机视频的效果。

2. 源码地址

Demo源码的地址:https://github.com/Jhuster/Android/tree/master/VideoServer,你也可以在本博文的附件中直接下载。

注意:使用前请首先将代码根目录下的movie.mp4文件拷贝到手机的SDCard根目录中。

3. 工作原理

(1)NanoHTTPD

这里是NanoHTTPD的官方网站:http://nanohttpd.org/

下载该库并添加到你的Android工程中,就可以使用NanoHTTPD类了,该类最重要的三个函数,一个是start(),一个是stop(),用于启动和停止Web Server,再一个就是serve(),该函数就是收到浏览器的请求后的回调函数,可以在该函数内部给浏览器返回响应的HTTP页面。

下面是一个最简单的对所有请求都返回404错误的示例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class VideoServer extends NanoHTTPD {

    

    public VideoServer(int port) {

        super(port);

    }

    

    @Override

    public Response serve(IHTTPSession session) {        

        StringBuilder builder = new StringBuilder();

        builder.append("<!DOCTYPE html><html><body>");        

        builder.append("404 -- Sorry, Can‘t Found "+ session.getUri() + " !");        

        builder.append("</body></html>\n");

        return new Response(builder.toString());

    }

}

其中,IHTTPSession类提供了一系列的接口,用来判断浏览器的请求内容,包括:GET/PUT类型、请求的URL等等,你可以以此为判断针对不同的请求完成服务或者返回相应的页面。

(2)浏览器中播放视频

要想通过浏览器直接播放视频,目前最常见的有两种方式,一种是采用Flash播放器,另一种利用HTML5标签,本文就是采用了HTML5标签实现的。

下面就是Android端收到HTTP请求之后返回的HTML5页面,参考:《HTML5教程》


1

2

3

4

5

6

7

8

9

10

11

<!DOCTYPE HTML>

<html>

<body>

<video width="320" height="240" controls="controls">

<source src="/storage/emulated/0/movie.mp4" type="video/mp4">

    Your browser doestn‘t support HTML5

</video>

</body>

</html>

浏览器收到该HTML5页面后,会进一步请求<source>标签给出的视频地址,这时Android端就需要通过字节流的形式将本地的视频文件发送给浏览器,代码如下:


1

2

3

4

5

6

7

8

9

10

 public Response responseVideoStream(IHTTPSession session,String videopath) {

     try {

         FileInputStream fis = new FileInputStream(videopath);

         return new NanoHTTPD.Response(Status.OK, "video/mp4", fis);

     

     catch (FileNotFoundException e) {        

         e.printStackTrace();

         return new Response("Error");

     

 }

4. 小结

关于如何利用NanoHttpd开发Android视频服务器就简单介绍到这里,希望对大家有所帮助,有任何疑问或者建议欢迎留言或者来信[email protected]交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。

时间: 2024-10-04 00:05:02

NanoHttpd的相关文章

使用NanoHttpd实现简易WebServer

0x00 在介绍使用NanoHttpd实现简易WebServer之前,我们首先熟悉下局域网Socket通信.一个Client工程,代码地址为https://github.com/jltxgcy/AppVulnerability/tree/master/MyClient.一个Server工程,代码地址为https://github.com/jltxgcy/AppVulnerability/tree/master/MyServer. 两个工程要在要同样的Wifi环境下,MyClient工程要修改连接

Android 中间人攻击

0x00 Android中间人攻击的思路就是劫持局域网中被攻击机器和server间的对话.被攻击机器和server表面上工作正常,实际上已经被中间人劫持.能够从一张图来明确这个过程. 受攻击主机发送的数据,首先经过了攻击者.从server返回的数据也经过攻击者,再发送给受攻击主机. 0x01 Android开源中间人攻击样例.请參考https://github.com/ssun125/Lanmitm.我们这里主要分析这个链接中效果预览中会话劫持的原理. watermark/2/text/aHR0

Android开发使用的常见第三方框架汇总

本文转载:http://blog.csdn.net/liuhaomatou/article/details/44857005 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

android 搭建https Server

在android上采用http协议的服务器,需求有点奇葩,非要用https更是醉了.这里只要求单向https认证,不要双向认证. 本文采用的开源框架Nanohttpd( https://github.com/NanoHttpd/nanohttpd ),在release页面下载jar包本地进行导入. Nano的使用比较简单,集成NanoHTTPD这个类,对serve函数进行重载即可. 这里强调使用是https,这个可能比较的麻烦.下面详细进行说明 public class CenterServic

webview资源本地化的一种实现方式

最近接手了一个crosswalk的任务,需要将Xwalkview的视频资源放到sd卡里面,以后每次遇到相同的视频就直接读取sd卡里面的内容. 刚开始想的使用crosswalk的webResourceClient,利用其中提供的'shouldInterceptLoadRequest'方法进行url的拦截和资源重新返回.起初使用这个替换图片,html页面都是可以的,但是替换视频的时候就出现了问题,发现拦截成功,但是返回资源的时候就失败了,仍然是从html中video的src中读取的.之后查找了相关的

百度全系APP SDK漏洞–WormHole虫洞漏洞

0x00 我们以百度地图v8.7.0为例来分析百度蠕虫漏洞,apk下载地址为https://github.com/jltxgcy/AppVulnerability/Baidu_Maps_v8.7.0.apk. 使用Android Killer来打开这个apk,Android Killer下载地址为http://pan.baidu.com/s/1jGQUzwa. 我们先讲述如何在代码层利用这个漏洞,然后再分析其原理. 百度蠕虫漏洞利用代码地址: 0x01 1.首先要安装百度地图v8.7.0的apk

搜狗市场高速下载以及网页端调起APP页面研究与实现

Github博文地址,此处更新可能不是很及时. 好久没写博客了,好大一个坑.正好,最近刚做完搜狗市场的高速下载功能,便拿来填了这个坑. 话说产品为了增加用户量,提升用户活跃度以及配合推广,更坑爹的是看到其他市场也有这些功能,等等,要求做一个捆绑下载的功能.WTF. 当然吐槽归吐槽,任务还是要完成的. 具体要求是: 用户在手机浏览WAP站点的时候,1.进入应用详情页时打开本应用(搜狗市场)里面的详情页面 2.点击WAP端高速下载时,如果本应用已安装,则调用本应用进行下载,否则下载本应用的捆绑包,安

在JAVA中使用LUA脚本记,javaj调用lua脚本的函数(转)

最近在做一些奇怪的东西,需要Java应用能够接受用户提交的脚本并执行,网络部分我选择了NanoHTTPD提供基本的HTTP服务器支持,并在Java能承载的许多脚本语言中选择了很久,比如Rhino,Jython和JRuby之类,但它们都太过庞大,并且很难实现沙盒保护服务器环境.最后我的目光投向了Lua,那个被称为粘合剂的语言.遇到的第一个难题是选择所使用的库,纯Java实现的Lua解释器有很多,什么LuaJ,LuaJava,kahlua,还有不知名的mochalua,jill等等(好多好多),其中

【转】如何开发自己的HttpServer-NanoHttpd源码解读

现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了.用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后都发生了什么技术细节还真不是很简单的.所以新的系列将是分享我学习Http Server的过程. NanoHttpd是Github上的一个开源项目,号称只用一个java文件就能创建一个http server,我将通过分析NanoHttpd的源码解析如何开发自己的HttpServer.Github 地址