安卓开发使用nanoHTTPd创建简单http服务器

官网地址:https://github.com/NanoHttpd/nanohttpd
1、添加依赖包
implementation 'org.nanohttpd:nanohttpd:2.3.1'

2、新建servlet,继承NanoHTTPD

3、构造函数 HttpServer(int port)和HttpServer(String hostname, int port)

4、处理请求方法serve();

5、获取GET方法请求参数:
Map<String, String> parms = session.getParms();

6、获取请求方法类型:
Method method = session.getMethod();

7、POST获取参数:
session.parseBody(new HashMap());//解决获取不到post参数
Map<String, String> parms = session.getParms();

8、创建简单响应头:
newFixedLengthResponse("我是服务器内容!");

9、 启动服务:
MyServer myServer=new MyServer(8080);
try {
myServer.start();
}catch (Exception e ){}

下面是我简单实现的复制粘贴即可运行
MainActivity.class

package com.mynanohttpd;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;

public class MainActivity extends Activity {

boolean  flg=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //创建服务并启动
        MyServer myServer=new MyServer(8080);
        myServer.asset=getAssets();//传递assets对象
        try {
        myServer.start();
        }catch (Exception e ){
            System.out.print(e);
        }
    }
}

MyServer.class

package com.mynanohttpd;

import android.content.res.AssetManager;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.Map;
import fi.iki.elonen.NanoHTTPD;

public class MyServer extends NanoHTTPD {


    AssetManager asset = null;

    public MyServer(int host) {
        super(host);
    }

    public MyServer(String ip, int host) {
        super(ip, host);
    }

    public NanoHTTPD.Response serve(NanoHTTPD.IHTTPSession iHTTPSession) {
        //获取参数
        Map parms = iHTTPSession.getParms();
        System.out.println(parms);
        System.out.println(iHTTPSession.getUri());
        if (iHTTPSession.getUri().equals("/")) {
            System.out.println(asset);
            return index();
        } 
        return newFixedLengthResponse("500");
    }

    private NanoHTTPD.Response index() {
        //加载Assets里的html文件
        return NanoHTTPD.newFixedLengthResponse(getIndex());
    }

    public String getIndex() {

        InputStream inputStream = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        StringBuffer sb = new StringBuffer();
        try {
            inputStream = asset.open("index.html");
            isr = new InputStreamReader(inputStream);
            br = new BufferedReader(isr);

            sb.append(br.readLine());
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append("\n" + line);
            }

            br.close();
            isr.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
                if (isr != null) {
                    isr.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return sb.toString();
    }
}

Assets目录的index.html


<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>Hello MUI</title>
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">

        <link rel="stylesheet" href="https://www.dcloud.io/hellomui/css/mui.min.css">
        <style>
            html,
            body {
                background-color: #efeff4;
            }
            p {
                text-indent: 22px;
            }
            span.mui-icon {
                font-size: 14px;
                color: #007aff;
                margin-left: -15px;
                padding-right: 10px;
            }
            .mui-off-canvas-left {
                color: #fff;
            }
            .title {
                margin: 35px 15px 10px;
            }
            .title+.content {
                margin: 10px 15px 35px;
                color: #bbb;
                text-indent: 1em;
                font-size: 14px;
                line-height: 24px;
            }
            input {
                color: #000;
            }
        </style>
    </head>

    <body>
        <div id="offCanvasWrapper" class="mui-off-canvas-wrap mui-draggable">
            <!--侧滑菜单部分-->
            <aside id="offCanvasSide" class="mui-off-canvas-left">
                <div id="offCanvasSideScroll" class="mui-scroll-wrapper">
                    <div class="mui-scroll">
                        <div class="title">侧滑导航</div>
                        <div class="content">
                            这是可拖动式侧滑菜单示例,你可以在这里放置任何内容;关闭侧滑菜单有多种方式: 1.在手机屏幕任意位置向左拖动(drag);2.点击本侧滑菜单页之外的任意位置; 3.点击如下红色按钮
                            <span class="android-only">;4.Android手机按back键;5.Android手机按menu键
                            </span>。
                            <p style="margin: 10px 15px;">
                                <button id="offCanvasHide" type="button" class="mui-btn mui-btn-danger mui-btn-block" style="padding: 5px 20px;">关闭侧滑菜单</button>
                            </p>

                        </div>
                        <div class="title" style="margin-bottom: 25px;">侧滑列表示例</div>
                        <ul class="mui-table-view mui-table-view-chevron mui-table-view-inverted">
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 1
                                </a>
                            </li>
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 2
                                </a>
                            </li>
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 3
                                </a>
                            </li>
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 4
                                </a>
                            </li>
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 5
                                </a>
                            </li>
                            <li class="mui-table-view-cell">
                                <a class="mui-navigate-right">
                                    Item 6
                                </a>
                            </li>
                        </ul>
                    </div>
                </div>
            </aside>
            <!--主界面部分-->
            <div class="mui-inner-wrap">
                <header class="mui-bar mui-bar-nav">
                    <a href="#offCanvasSide" class="mui-icon mui-action-menu mui-icon-bars mui-pull-left"></a>
                    <a class="mui-action-back mui-btn mui-btn-link mui-pull-right">关闭</a>
                    <h1 class="mui-title">div模式右滑菜单</h1>
                </header>
                <div id="offCanvasContentScroll" class="mui-content mui-scroll-wrapper">
                    <div class="mui-scroll">
                        <div class="mui-content-padded">
                            <p>这是可拖动式右滑导航示例,主页面和菜单在一个HTML文件中, 优点是支持拖动手势(跟手),缺点是不支持菜单内容在多页面的复用; 当前页面为主界面,你可以在主界面放置任何内容; 打开侧滑菜单有多种方式: 1、在当前页面向右拖动; 2、点击页面左上角的
                                <span class="mui-icon mui-icon-bars"></span> 图标; 3、通过JS API触发(例如点击如下蓝色按钮体验);
                                <span class="android-only">4、Android手机按menu键;</span>
                            </p>
                            <p style="padding: 5px 20px;margin-bottom: 5px;">
                                <button id="offCanvasShow" type="button" class="mui-btn mui-btn-primary mui-btn-block" style="padding: 10px;">
                                    显示侧滑菜单
                                </button>
                            </p>
                            <p>侧滑菜单的移动动画,支持多种效果,切换如下选项体验不同动画效果:</p>

                        </div>

                        <form class="mui-input-group" style="margin-bottom: 15px;">
                            <div class="mui-input-row mui-radio">
                                <label>主界面移动、菜单不动</label>
                                <input name="style" type="radio" checked="" value="main-move">
                            </div>
                            <div class="mui-input-row mui-radio">
                                <label>主界面不动、菜单移动</label>
                                <input name="style" type="radio" value="menu-move">
                            </div>
                            <div class="mui-input-row mui-radio mui-hidden" id="move-togger">
                                <label>整体移动</label>
                                <input name="style" type="radio" value="all-move">
                            </div>
                            <div class="mui-input-row mui-radio">
                                <label>缩放式侧滑(类手机QQ)</label>
                                <input name="style" type="radio" value="main-move-scalable">
                            </div>
                        </form>

                    </div>
                </div>
                <!-- off-canvas backdrop -->
                <div class="mui-off-canvas-backdrop"></div>
            </div>
        </div>
        <script src="https://www.dcloud.io/hellomui/js/mui.min.js"></script>
        <script>
            mui.init();
             //侧滑容器父节点
            var offCanvasWrapper = mui('#offCanvasWrapper');
             //主界面容器
            var offCanvasInner = offCanvasWrapper[0].querySelector('.mui-inner-wrap');
             //菜单容器
            var offCanvasSide = document.getElementById("offCanvasSide");
            if (!mui.os.android) {
                document.getElementById("move-togger").classList.remove('mui-hidden');
                var spans = document.querySelectorAll('.android-only');
                for (var i = 0, len = spans.length; i < len; i++) {
                    spans[i].style.display = "none";
                }
            }
             //移动效果是否为整体移动
            var moveTogether = false;
             //侧滑容器的class列表,增加.mui-slide-in即可实现菜单移动、主界面不动的效果;
            var classList = offCanvasWrapper[0].classList;
             //变换侧滑动画移动效果;
            mui('.mui-input-group').on('change', 'input', function() {
                if (this.checked) {
                    offCanvasSide.classList.remove('mui-transitioning');
                    offCanvasSide.setAttribute('style', '');
                    classList.remove('mui-slide-in');
                    classList.remove('mui-scalable');
                    switch (this.value) {
                        case 'main-move':
                            if (moveTogether) {
                                //仅主内容滑动时,侧滑菜单在off-canvas-wrap内,和主界面并列
                                offCanvasWrapper[0].insertBefore(offCanvasSide, offCanvasWrapper[0].firstElementChild);
                            }
                            break;
                        case 'main-move-scalable':
                            if (moveTogether) {
                                //仅主内容滑动时,侧滑菜单在off-canvas-wrap内,和主界面并列
                                offCanvasWrapper[0].insertBefore(offCanvasSide, offCanvasWrapper[0].firstElementChild);
                            }
                            classList.add('mui-scalable');
                            break;
                        case 'menu-move':
                            classList.add('mui-slide-in');
                            break;
                        case 'all-move':
                            moveTogether = true;
                            //整体滑动时,侧滑菜单在inner-wrap内
                            offCanvasInner.insertBefore(offCanvasSide, offCanvasInner.firstElementChild);
                            break;
                    }
                    offCanvasWrapper.offCanvas().refresh();
                }
            });
             //主界面‘显示侧滑菜单’按钮的点击事件
            document.getElementById('offCanvasShow').addEventListener('tap', function() {
                offCanvasWrapper.offCanvas('show');
            });
             //菜单界面,‘关闭侧滑菜单’按钮的点击事件
            document.getElementById('offCanvasHide').addEventListener('tap', function() {
                offCanvasWrapper.offCanvas('close');
            });
             //主界面和侧滑菜单界面均支持区域滚动;
            mui('#offCanvasSideScroll').scroll();
            mui('#offCanvasContentScroll').scroll();
             //实现ios平台原生侧滑关闭页面;
            if (mui.os.plus && mui.os.ios) {
                mui.plusReady(function() { //5+ iOS暂时无法屏蔽popGesture时传递touch事件,故该demo直接屏蔽popGesture功能
                    plus.webview.currentWebview().setStyle({
                        'popGesture': 'none'
                    });
                });
            }
        </script>
    </body>

</html>

AndroidManifest.xml里需要添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

最后看看效果


©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容