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文件夹复制到项目下即可使用了。
项目中的截图如下:
如果比较懒不想去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("- "+file.getName()+"
");
}
}
builder.append("- 分享文件数量: "+fileList.size()+"
");
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("