用NanoHttpd在Android上实现HttpServer

本文介绍了如何在Android上使用NanoHttpd搭建HTTP Server,并详细展示了通过自定义HttpServer类来处理POST请求的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使

最近的项目中需要在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();
    }
    ...............
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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<String, String> files = new HashMap<String, String>();
            /*获取header信息,NanoHttp的header不仅仅是HTTP的header,还包括其他信息。*/
            Map<String, String> 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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值