请选择 进入手机版 | 继续访问电脑版

牛大大的个人博客

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 199|回复: 4

ANDROID 搭建一个小型的WEB服务器 NanoHttpd

[复制链接]

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
发表于 2021-5-4 11:14:11 | 显示全部楼层 |阅读模式
NanoHTTPD是一个免费的,简单的,很小的(只有一个Java文件) HTTP服务器,它可以很好地嵌入到Java程序中.


NanoHttpd是个很强大的开源库,仅仅用一个Java类,就实现了一个轻量级的 Web Server,可以非常方便地集成到Android应用中去,让你的App支持 HTTP GET, POST, PUT, HEAD 和 DELETE 请求。
为了演示它的功能,我利用该库搭建了一个简单地Android视频服务器,可以通过PC浏览器远程播放Android手机存储器中的mp4视频文件。

Demo效果
左边是手机端App界面,右边是在电脑的浏览器中远程播放手机视频的效果。
工作原理
这里是NanoHTTPD的官方网站: http://nanohttpd.org/
下载该库并添加到你的Android工程中,就可以使用NanoHTTPD类了,该类最重要的三个函数,一个是start(),一个是 stop(),用于启动和停止Web Server,再一个就是serve(),该函数就是收到浏览器的请求后的回调函数,可以在该函数内部给浏览器返回响应的HTTP页面。
下面是一个最简单的对所有请求都返回404错误的示例:
  1. public class VideoServer extends NanoHTTPD {
  2.   public VideoServer(int port) {
  3.     super(port);
  4.   }
  5.   @Override
  6.   public Response serve(IHTTPSession session) {     
  7.     StringBuilder builder = new StringBuilder();
  8.     builder.append("<!DOCTYPE html><html><body>");        
  9.     builder.append("404 -- Sorry, Can't Found "+ session.getUri() + " !");      
  10.     builder.append("</body></html>\n");
  11.     return new Response(builder.toString());
  12.   }
  13. }
复制代码
其中,IHTTPSession类提供了一系列的接口,用来判断浏览器的请求内容,包括:GET/PUT类型、请求的URL等等,你可以以此为判断针对不同的请求完成服务或者返回相应的页面。
(2)浏览器中播放视频
要想通过浏览器直接播放视频,目前最常见的有两种方式,一种是采用Flash播放器,另一种利用HTML5标签,本文就是采用了HTML5标签实现的。
下面就是Android端收到HTTP请求之后返回的HTML5页面,参考:
  1. <!DOCTYPE HTML>
  2. <html>
  3. <body>

  4. <video width="320" height="240" controls="controls">
  5. <source src="/storage/emulated/0/movie.mp4" type="video/mp4">
  6.     Your browser doestn't support HTML5
  7. </video>
  8. </body>

  9. </html>
复制代码
浏览器收到该HTML5页面后,会进一步请求<source>标签给出的视频地址,这时Android端就需要通过字节流的形式将本地的视频文件发送给浏览器,代码如下:
  1. public Response responseVideoStream(IHTTPSession session,String videopath) {
  2.   try {
  3.     FileInputStream fis = new FileInputStream(videopath);
  4.     return new NanoHTTPD.Response(Status.OK, "video/mp4", fis);
  5.   }
  6.   catch (FileNotFoundException e) {     
  7.     e.printStackTrace();
  8.     return new Response("Error");
  9.   }
  10. }
复制代码

4. 小结
关于如何利用NanoHttpd开发Android视频服务器就简单介绍到这里,希望对大家有所帮助

回复

使用道具 举报

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
 楼主| 发表于 2021-5-4 15:42:29 | 显示全部楼层
  1.    @Override
  2.     public Response serve(IHTTPSession session) { // 此方法等同于TomCat总控制器,因为没有向Struts2那样映射过,故请求跳转的url需要我们自己处理,此方法会接收所有请求
  3.         Method method = session.getMethod();
  4.         String uri = session.getUri();
  5.         SimpleServer.LOG.info(method + " '" + uri + "' ");

  6.         String msg = "<html><body><h1>Hello server</h1>\n";
  7.         Map<String, String> parms = session.getParms();
  8.         if (parms.get("username") == null) {
  9.             msg += "<form action='?' method='get'>\n" + "  <p>Your name: <input type='text' name='username'></p>\n" + "</form>\n";
  10.         } else {
  11.             msg += "<p>Hello, " + parms.get("username") + "!</p>";
  12.         }

  13.         msg += "</body></html>\n";

  14.         return newFixedLengthResponse(msg);
  15.     }
  16. }
复制代码


回复

使用道具 举报

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
 楼主| 发表于 2021-5-4 15:59:08 | 显示全部楼层
提交方式:get提交。
地址栏:http://localhost:9891/?user=abc&psw=123&repsw=123&sex=nan&tech=java&tech=html&country=cn

GET /?user=abc&psw=123&repsw=123&sex=nan&tech=java&tech=html&country=cn HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn,zu;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)
Host: localhost:9891
Connection: Keep-Alive


提交方式:POST
地址栏:http://localhost:9891/

POST / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn,zu;q=0.5
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)
Host: localhost:9891
Content-Length: 68
Connection: Keep-Alive
Cache-Control: no-cache

user=hahah&psw=8989&repsw=8989&sex=nv&tech=html&tech=css&country=usa



        GET提交和POST提交的区别?
        1,
        get提交,提交的信息都显示在地址栏中。
        post提交,提交的信息不显示地址栏中。

        2,
        get提交,对于敏感的数据信息不安全。
        post提交,对于敏感信息安全。

        3,
        get提交,对于大数据不行,因为地址栏存储体积有限。
        post提交,可以提交大体积数据。

        4,
        get提交,将信息封装到了请求消息的请求行中。
        post提交,将信息封装到了请求体中。

        在服务端的一个区别。
        如果出现将中文提交到tomcat服务器,服务器默认会用iso8859-1进行解码会出现乱码,
        通过iso8859-1进行编码,在用指定的中文码表解码。即可。
        这种方式对get提交和post提交都有效。

        但是对于post提交方式提交的中文,还有另一种解决办法,就是直接使用服务端一个对象
        request对象的setCharacterEncoding方法直接设置指定的中文码表就可以将中文数据解析出来。
        这个方法只对请求体中的数据进行解码。


        综上所述:表单提交,建议使用post。



        和服务端交互的三种方式:
        1,地址栏输入url地址。get
        2,超链接。 get
        3,表单。 get 和  post



        如果在客户端进行增强型的校验(只要有一个组件内容是错误,是无法继续提交的。只有全对才可以提交)
        问,服务端收到数据后,还需要校验吗?
        需要,为了安全性。
        为了信息安全,也为了客户端那边不要乱提交数据,客户端和服务端都需要做校验。

        如果服务端做了增强型的校验,客户端还需要校验吗?
        需要,因为要提高用户的上网体验效果,减轻服务器端的压力。



回复

使用道具 举报

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
 楼主| 发表于 2021-5-4 16:38:50 | 显示全部楼层
<body>
   钛牛综合视频播放器   
    <br>
    <form action="screenurl.html" method="post">         
      <table border="1" bordercolor="#00ffff" cellpadding=11 cellspacing= 5
width=1000>
  <tr><th colspan="2">视频提交表单</th></tr>
    <tr><td>分屏:</td>
       <td>
          <input type="radio" name="screen" value="one" checked="checked"/>单屏
          <input type="radio" name="screen" value="four"  />四屏
       </td>
    </tr>   
    <tr><td>视频1:</td><td><input type="text" name="sc1" size = 100 ></td></tr>
    <tr><td>视频2:</td><td><input type="text" name="sc2" size = 100 /></td></tr>
    <tr><td>视频3:</td><td><input type="text" name="sc3" size = 100 /></td></tr>
    <tr><td>视频4:</td><td><input type="text" name="sc4" size = 100 /></td></tr>   
   
   
       <tr><th colspan="2">
         <input type="reset" value="清除数据" />
         <input type="submit" value="提交数据" /></th>
       </tr>
        </table>
    </form>


回复

使用道具 举报

149

主题

201

帖子

643

积分

版主

Rank: 7Rank: 7Rank: 7

积分
643
 楼主| 发表于 2021-5-4 16:52:02 | 显示全部楼层
POST

if (method.equals(Method.POST)){
    Map<String, String> files = new HashMap<String, String>();
    /*获取header信息,NanoHttp的header不仅仅是HTTP的header,还包括其他信息。*/
    Map<String, String> header = session.getHeaders();

    try {
        session.parseBody(files);
       String param=files.get("postData");

        Log.d(TAG,"header : " + header);
        Log.d(TAG,"files : " + files);
        Log.d(TAG,"param : " + param);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ResponseException e) {
        e.printStackTrace();
    }

}




复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|牛大大的个人博客 ( 苏ICP备17043571号-2 )

GMT+8, 2021-6-15 12:08 , Processed in 0.173656 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表