使用NanoHttpd在Android项目中搭建服务器

NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。

github地址:https://github.com/NanoHttpd/nanohttpd。

下载完demo项目后,解压,找到路径,我的是放在F盘下:

F:\nanohttpd-master\core\src\main\java\org\nanohttpd

把整个nanohttpd文件夹复制到项目下即可使用了。

项目中的截图如下:

使用NanoHttpd在Android项目中搭建服务器_第1张图片

如果比较懒不想去github下载的话,可以直接在build.gradle中添加依赖(我之前是不知道这个依赖,所以用的是下载的文件):

implementation'org.nanohttpd:nanohttpd:2.2.0'

 具体使用:

首先先写一个类FileServer继承nanohttpd:

package caro.automation.server;

import org.nanohttpd.protocols.http.IHTTPSession;
import org.nanohttpd.protocols.http.NanoHTTPD;
import org.nanohttpd.protocols.http.response.Response;
import org.nanohttpd.protocols.http.response.Status;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

/**
 * Created by XDA on 2019/4/2.
 */
public class FileServer extends NanoHTTPD {
//    public static final int DEFAULT_SERVER_PORT= com.example.zjt.nanohttpexample.Status.MY_PORT;//为8080
    public static final int DEFAULT_SERVER_PORT= 8080;//为8080
    public static final String TAG = FileServer.class.getSimpleName();
    //根目录
    private static  final String REQUEST_ROOT = "/";
    private List fileList;//用于分享的文件列表

    public FileServer(List fileList){
        super(DEFAULT_SERVER_PORT);
        this.fileList = fileList;
    }
    //当接受到连接时会调用此方法
    public Response serve(IHTTPSession session){
        if(REQUEST_ROOT.equals(session.getUri())||session.getUri().equals("")){
            return responseRootPage(session);
        }
        return responseFile(session);
    }
    //对于请求根目录的,返回分享的文件列表
    public Response responseRootPage(IHTTPSession session){
        StringBuilder builder = new StringBuilder();
        builder.append("");
        builder.append("
    "); for(int i = 0 , len = fileList.size(); i < len ; i++){ File file = new File(fileList.get(i).getPath()); if(file.exists()){ //文件及下载文件的链接,定义了一个文件类,这里使用getPath方法获得路径,使用getName方法获得文件名 builder.append("
  1. "+file.getName()+"
  2. "); } } builder.append("
  3. 分享文件数量: "+fileList.size()+"
  4. "); builder.append("
"); builder.append("\n"); //回送应答 return Response.newFixedLengthResponse(String.valueOf(builder)); } //对于请求文件的,返回下载的文件 public Response responseFile(IHTTPSession session){ try { //uri:用于标示文件资源的字符串,这里即是文件路径 String uri = session.getUri(); //文件输入流 FileInputStream fis = new FileInputStream(uri); // 返回OK,同时传送文件,为了安全这里应该再加一个处理,即判断这个文件是否是我们所分享的文件,避免客户端访问了其他个人文件 return Response.newFixedLengthResponse(Status.OK,"application/octet-stream",fis,fis.available()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return response404(session,null); } //页面不存在,或者文件不存在时 public Response response404(IHTTPSession session,String url) { StringBuilder builder = new StringBuilder(); builder.append("body>"); builder.append("Sorry,Can't Found" + url + " !"); builder.append("\n"); return Response.newFixedLengthResponse(builder.toString()); } }

然后创建一个服务类HttpServer来开启FileServer:

package caro.automation.server;

import org.nanohttpd.protocols.http.IHTTPSession;
import org.nanohttpd.protocols.http.NanoHTTPD;
import org.nanohttpd.protocols.http.response.Response;
import org.nanohttpd.protocols.http.response.Status;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import caro.automation.MyApplication;
import caro.automation.modify.DatabaseSelectUpload;

/**
 * Created by XDA on 2019/3/25.
 */
public class HttpServer extends NanoHTTPD {
    private static final String TAG = "Http";
    public HttpServer(int port) {
        super(port);
    }






    @Override
    public Response serve(IHTTPSession session) {


            try {
                for (int i = 0; i < DatabaseSelectUpload.name_.size(); i++) {  //for 循环文件名 小于name的个数
                session.parseBody(new HashMap());
                final String choose = DatabaseSelectUpload.name_.get(i);//获取循环到的文件名
                String strDBPath = MyApplication.GetApp().getExternalFilesDir(null) + "/TIS-Smarthome/" + choose + "/" + (choose + ".db3");//数据库地址

                    FileInputStream fis = new FileInputStream(strDBPath);

                    return Response.newFixedLengthResponse(Status.OK, "application/octet-stream", fis, fis.available());
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ResponseException e) {
                e.printStackTrace();
            }

        return response404(session, null);
    }

    //页面不存在,或者文件不存在时
    public Response response404(IHTTPSession session,String url) {
               StringBuilder builder = new StringBuilder();
        builder.append("body>");
        builder.append("Sorry,Can't Found" + url + " !");
        builder.append("\n");
        return Response.newFixedLengthResponse(builder.toString());
    }



}

ps: 

"application/octet-stream"

这个参数的意思是以流的形式下载文件,这样可以实现任意格式的文件下载。

 

然后在需要开启服务器的地方,例如在Activity的onCreate方法中开启:

startService(new Intent(getApplicationContext(),MyServer.class));//开启NanoHttpD 8080端口

记得在onDestroy方法中关闭服务器:

stopService(new Intent(getApplicationContext(),MyServer.class)); //关闭 NanoHTTPD   8080

我的是192.168.1.168:8080 打开后可以看到:

使用NanoHttpd在Android项目中搭建服务器_第2张图片

这里显示的就是页面为空的时候的显示。response404()方法里面写好的显示内容。

 

这样就是成功开启了服务器了。然后就可以根据这个url来上传下载文件。

我这边是使用的OKgo来上传下载文件的。下一篇会介绍一下我自己写的辣鸡代码。

简单使用Okgo上传下载文件,有兴趣可以瞄一下。

你可能感兴趣的:(Android,nanohttpd)