前言
顾客在无人售货机前购买商品,需要把选购的商品信息上传给Android应用并显示在屏幕上,通信协议为Http协议,无人售货机将作为客户端,Android应用作为服务端,通过http协议,将商品信息上传给Android应用并显示,在这样的场景下,就需要再Android应用程序中搭建一个Http服务器,在Android应用程序中搭建服务器不比java后台那样,那么有什么好的方式可以实现这样的应用场景呢?现在是开源的世界,什么样的需求和功能,都能够很容易找到解决方案,我们可以通过一个开源的服务器框架来实现,它就是NanoHTTPD,NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小,如果要使用它的话,需要在官网下载源码,把相应的源码拷贝到自己的项目中,并继承相应的类。
开始在Android项目中搭建Http服务器
1、首先需要下载NanoHTTPD的源码,官网的源码下载下来到放到项目中使用可能比较麻烦,为了方便,我这里提供一个我自己在使用的源码,源码地址:
https://pan.baidu.com/s/1BrDCA66jajI8CWJroSikpw
2、源码下载下来以后,将其拷贝在自己的项目中,下图是我拷贝到项目中的目录结构,仅供参考:
3、拷贝到自己项目中以后,创建一个新类,并继承NanoHTTPD类,重写serve()方法,注意构造函数不能少,在创建对象时,需要把端口传给父类。
public class Http extends NanoHTTPD {
private static final String TAG = "Http";
public Http(int port) {
super(port);
}
@Override
public Response serve(IHTTPSession session) {
try {
// 这一句话必须要写,否则在获取数据时,获取不到数据
session.parseBody(new HashMap());
} catch (IOException e) {
e.printStackTrace();
} catch (ResponseException e) {
e.printStackTrace();
}
StringBuilder builder = new StringBuilder();
Method method = session.getMethod();
String uri = session.getUri();
Mapparms = session.getParms();
String data = parms.get("data");//这里的data是POST提交表单时key
Log.i(TAG, "uri: "+uri);//如果有uri,会打印出uri
Log.i(TAG, "data: "+data);
builder.append("任意内容");// 反馈给调用者的数据
return newFixedLengthResponse(builder.toString());
}
4、在项目中新建一个Android服务,在该服务的onStartCommand()方法中创建刚才新建好的Http对象并调用它的方法start()方法开启http服务,端口可任意指定(0~65535之间都可以)。
public class MyServer extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 创建对象,端口我这里设置为8080
HttpService myServer = new HttpService(8080);
try {
// 开启HTTP服务
myServer.start();
} catch (IOException e) {
e.printStackTrace();
}
return super.onStartCommand(intent, flags, startId);
}
}
5、启动项目,通过http请求工具进行测试,前提是项目所在的设备需要连接网络,测试地址是设备上的IP地址加上端口,最后可以看到Android项目服务器接收到了数据。