Nanohttpd

时间:2018-09-07 08:43:47

标签: java android httpserver nanohttpd

我想制作一个可以在Java Desktop和Android上使用的非常简单的服务器,因此我可能会选择小型图书馆NanoHttpd。如果有人有更好的选择,请随时推荐。

因此,该服务器主要用于来自许多自定义WiFi专用设备的文件接收,并用于向其推送一些设置。但是,由于文件可能很大(200Mb +)并且传输速率很慢,所以我需要能够从服务器(Android / PC)访问此传输的进度。

NanoHttpd是否有办法获得这一进展?到目前为止,我似乎已经了解到,在调用“ serve()”方法并完成下载之前,请求已完全收到。

1 个答案:

答案 0 :(得分:0)

一个非常老的问题,但我想它将帮助任何人到达这里。

如果您正在谈论nanohttpd正在提供的文件的进度,则可以非常轻松地做到这一点。复制该类到您的代码中

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class ProgressInputStream extends InputStream {

    private InputStream in;
    private int length, sumRead;
    private java.util.List<Listener> listeners;
    private double percent;

    public ProgressInputStream(InputStream inputStream, int length) {
        this.in = inputStream;
        listeners = new ArrayList<>();
        sumRead = 0;
        this.length = length;
    }


    @Override
    public int read(byte[] b) throws IOException {
        int readCount = in.read(b);
        evaluatePercent(readCount);
        return readCount;
    }


    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int readCount = in.read(b, off, len);
        evaluatePercent(readCount);
        return readCount;
    }

    @Override
    public long skip(long n) throws IOException {
        long skip = in.skip(n);
        evaluatePercent(skip);
        return skip;
    }

    @Override
    public int read() throws IOException {
        int read = in.read();
        if (read != -1) {
            evaluatePercent(1);
        }
        return read;
    }

    public ProgressInputStream addListener(Listener listener) {
        this.listeners.add(listener);
        return this;
    }

    private void evaluatePercent(long readCount) {
        if (readCount != -1) {
            sumRead += readCount;
            percent = sumRead * 1.0 / length;
        }
        notifyListener();
    }

    private void notifyListener() {
        for (Listener listener : listeners) {
            listener.process(percent);
        }
    }
}

进度界面

public interface ProgressListener {
    void process(double percent);
}

现在,您可以通过在nanohttpd方法中编写此代码来了解serve正在处理的任何文件的进度

@Override
public NanoHTTPD.Response server(NanoHTTPD.IHTTPSession session) throws FileNotFoundException {
    if(session.getUri().equals("/file_to_be_served")) {
        File file = new File("file_to_be_served");
        FileInputStream fis = new FileInputStream(file);
        ProgressInputStream pis = new ProgressInputStream(fis, (int) file.length());
        pis.addListener(mProgressListener);
        return newChunkedResponse(NanoHTTPD.Response.Status.OK, "mime_type_of_the_file", pis);
    }
}

file_to_be_served将是文件的路径,而mime_type_of_the_file应该是mimetype

现在,您可以根据需要修改此样板代码。希望对大家有帮助。