使用NanoHttpd在Android上实现HttpServer

最近的项目中需要在Androd上搭建一个HttpServer,这个Server用于接收智能设备的实时数据,这个时候就需要使用Java打架一个HttpServer服务了,最初的方案使用Java自带的com.sun.net.httpserver.HttpServer然后发现Android并没有实现这个类的依赖库,造成总是空指针错误。接下来找到了NanoHttpd发现使用它是一个比较完美的方案。

NanoHttpd介绍

NanoHttpd是使用Java实现的微型web server,是一个可嵌入应用程序的轻量级的HTTP Server。

结合Android使用

下面我就结合Android使用,目前我将其放在了Server中。

public class MainService extends Service {    private HttpServer mHttpServer = null;//这个是HttpServer的句柄。      .............      @Override    public void onCreate() {    //在这里开启HTTP Server。        mHttpServer = new HttpServer(8092);        try {            mHttpServer.start();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void onDestroy() {    //在这里关闭HTTP Server        if(mHttpServer != null)            mHttpServer.stop();    }    ...............

HttpServer的具体实现

public class HttpServer extends NanoHTTPD {    /*这类就是要自定义一些返回值,我在这里定义了700。都属于自定义*/    public enum Status implements NanoHTTPD.Response.IStatus {        SWITCH_PROTOCOL(101, "Switching Protocols"),        NOT_USE_POST(700, "not use post");        private final int requestStatus;        private final String description;        Status(int requestStatus, String description) {            this.requestStatus = requestStatus;            this.description = description;        }        @Override        public String getDescription() {            return null;        }        @Override        public int getRequestStatus() {            return 0;        }    }    public HttpServer(int port) {        super(port);    }    @Override    public Response serve(IHTTPSession session) {        /*我在这里做了一个限制,只接受POST请求。这个是项目需求。*/        if (Method.POST.equals(session.getMethod())) {            Map files = new HashMap();            /*获取header信息,NanoHttp的header不仅仅是HTTP的header,还包括其他信息。*/            Map header = session.getHeaders();            try {                /*这句尤为重要就是将将body的数据写入files中,大家可以看看parseBody具体实现,倒现在我也不明白为啥这样写。*/                session.parseBody(files);                /*看就是这里,POST请教的body数据可以完整读出*/                String body = session.getQueryParameterString();                CNTrace.d("header : " + header);                CNTrace.d("body : " + body);                /*这里是从header里面获取客户端的IP地址。NanoHttpd的header包含的东西不止是HTTP heaer的内容*/                header.get("http-client-ip"),            } catch (IOException e) {                e.printStackTrace();            } catch (ResponseException e) {                e.printStackTrace();            }            /*这里就是为客户端返回的信息了。我这里返回了一个200和一个HelloWorld*/            return newFixedLengthResponse(NanoHTTPD.Response.Status.OK, "text/html", "HelloWorld");        }else            return newFixedLengthResponse(Status.NOT_USE_POST, "text/html", "use post");    }}

结束

到此结束了,NanoHttpd对Android来说是一个不错的微型服务器解决方案。也可以在Android网站上找到,这个方案SimpleWebServer.java,经过对比真的没有NanoHttpd好用。

更多相关文章

  1. Android开发中高效的数据结构用SparseArray代替HashMap
  2. [置顶] android 批量插入数据
  3. Android市场官方的统计信息
  4. Android Studio真机调试,数据库sqllite时,Multiple dex files defi
  5. JAVA数据结构及算法--Android中Activity的四种启动模式
  6. UnityAndroid开发(1) 打包和使用Sqlite数据库

随机推荐

  1. android后台获取当前屏幕截图(screencap.c
  2. SharePreferences实现
  3. Netbeans 装Android
  4. Android(安卓)home键和back键区别
  5. [转]JS调用Android里面的方法,Android调用
  6. android 按钮设计中state_selected属性
  7. 高焕堂——Android框架底层结构知多少?
  8. Android(安卓)UI 设计秘笈
  9. Android中的lcd_density设置
  10. android反编译apk文件