使用NanoHttpd在Android上实现HttpServer
使用NanoHttpd在Android上实现HttpServer
http://blog.csdn.net/kingroc/article/details/52275741
最近的项目中需要在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<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");
}
}
结束
到此结束了,NanoHttpd对Android来说是一个不错的微型服务器解决方案。也可以在Android网站上找到,这个方案SimpleWebServer.java,经过对比真的没有NanoHttpd好用。