文档章节

实战nanoHTTPD嵌入android app(2)

短短的歼击机
 短短的歼击机
发布于 08/06 11:19
字数 882
阅读 1
收藏 0

上回咱们把基本的架子搭好了,不过也说了这个架子基本是不可用的,这回咱们就把它改造成基本可用的。


3. 支持html文件

首先我们先实现对html的支持:

  1. 添加src/main/assets文件夹,把html文件都放到这个文件夹下
  2. 修改server函数:
public Response serve(IHTTPSession session) {

    String uri = session.getUri();
    String filename = uri.substring(1);

    if (uri.equals("/"))
        filename = "index.html";

    String response = "";
    String line = "";
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(_mainContext.getAssets().open(filename)));

        while ((line = reader.readLine()) != null) {
          response += line;
        }

        reader.close();

      } catch (IOException e) {
        e.printStackTrace();
    }

  return newFixedLengthResponse(response);
}

P.S.: 留个作业,为啥这里选assets文件夹呢?其他文件夹可以吗?

其实逻辑很简单,就是找到想要打开的网页文件,然后把文件内容读出来返回。

看上去这个逻辑应该也能应付js和css对吧(image咱后面再说),但实际上你添加上js文件后,你会发现浏览器端是访问不到的,为啥呢?

这个咱得去nanoHTTPD的源码里瞅瞅去。(别一说要看源码就慌了,没那么恐怖,咱只看跟咱们问题相关的那几行,然后再结合上猜就差不多了)

4. 浅入探索nanoHTTPD源码

这里咱们用到一个newFixedLengthResponse函数,所以咱们首先看看这个函数是咋干活的:

public static Response newFixedLengthResponse(String msg) {
    return newFixedLengthResponse(Status.OK, NanoHTTPD.MIME_HTML, msg);
}

就一行代码,简单明了,一个html的状态,一个html的类型,一个咱刚刚传入的html正文。再结合咱的js和css,应该能猜出问题出在MIME_HTML上,我们看下这个变量的定义:

public static final String MIME_HTML = "text/html";

如果你对html比较在行的话,应该能猜出来js对应的这个值应该是:text/javascript,css对应的是:text/css对吧,实际上在nanoHTTPD项目的源码里也确实有这个定义的:

https://github.com/NanoHttpd/nanohttpd/blob/master/core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties

#default mime types for nanohttpd, use META-INF/mimetypes.properties for user defined mimetypes

css=text/css
htm=text/html
html=text/html
xml=text/xml
java=text/x-java-source, text/java
md=text/plain
txt=text/plain
asc=text/plain
gif=image/gif
jpg=image/jpeg
jpeg=image/jpeg
png=image/png
svg=image/svg+xml
mp3=audio/mpeg
m3u=audio/mpeg-url
mp4=video/mp4
ogv=video/ogg
flv=video/x-flv
mov=video/quicktime
swf=application/x-shockwave-flash
js=application/javascript
pdf=application/pdf
doc=application/msword
ogg=application/x-ogg
zip=application/octet-stream
exe=application/octet-stream
class=application/octet-stream
m3u8=application/vnd.apple.mpegurl
ts=video/mp2t

5. 支持js和css

本着代码能工作,绝不多学一点”的原则,我们再改下咱们的代码:

public Response serve(IHTTPSession session) {

    String uri = session.getUri();
    System.out.println("####MyWebServer:" + uri);
    String filename = uri.substring(1);

    if (uri.equals("/"))
        filename = "index.html";

    String mimetype = "text/html";
    if (filename.contains(".html") || filename.contains(".htm")) {
        mimetype = "text/html";
    } else if (filename.contains(".js")) {
        mimetype = "text/javascript";
    } else if (filename.contains(".css")) {
        mimetype = "text/css";
    } else {
        filename = "index.html";
        mimetype = "text/html";
    }

    String response = "";
    String line = "";
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(_mainContext.getAssets().open(filename)));

        while ((line = reader.readLine()) != null) {
            response += line;
        }
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return newFixedLengthResponse(Response.Status.OK, mimetype, response);
}

OK,app重启,浏览刷新!

是不是js和css也都OK了。(不OK的同学,下课可以找我)


嗯,就剩下一个image显示的问题了,咱一篇见。



作者:tonytalks
链接:https://www.jianshu.com/p/63069731e237
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

© 著作权归作者所有

短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
NanoHTTPD 2.1.0 发布,嵌入式 HTP 服务器

NanoHTTPD 2.1.0 发布了,该版本增加了对 WebSocket 的支持。 NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DE...

oschina
2014/04/25
2.2K
7
远程控制你的智能电视,按键|输入|安装App等都已实现,已开源!

一、序 Hi,大家好,我是承香墨影! 智能电视或者智能盒子,不知道大家了解多少? 这两年各大厂商生产的电视设备,基本上都是搭载的 Android 系统。既然电视本身就是 Android 系统的,我们也...

承香墨影
2018/10/29
0
0
关于Andriod 调用nanohttpd类实现局域网访问html

    想把工作中遇到的问题记录下来,刚刚学会调用nanohttpd类,简洁明了。附上nanohttpd包下载地址https://github.com/NanoHttpd/nanohttpd 首先介绍一下nanohttpd在此处的用途,可以通过...

丝竹管弦
2018/08/07
0
0
NanoHttpd 2.0.3 发布,嵌入式 HTTP 服务器

NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中. NanoHttpd 2.0.3 修复恶劣在三星手机上导致堆栈跟踪的一个 bug,实现了 Connection: keep-alive...

oschina
2013/06/20
893
2
NanoHTTPD 2.0.5 发布,嵌入式 HTTP 服务器

NanoHTTPD 2.0.5 版本是主要是 Bug 修复和稳定性的改进。 NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE...

oschina
2013/12/14
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部