Java 使用Nanohttpd进行文件传输

Java 使用Nanohttpd进行文件传输,java,android,httpserver,nanohttpd,Java,Android,Httpserver,Nanohttpd,我想制作一个非常简单的服务器,既可以在Java桌面上使用,也可以在Android上使用,因此我可能会选择小型库。如果有人有更好的选择,请随意推荐 因此,服务器主要用于接收来自许多自定义WiFi设备的文件,并将一些设置推送到这些设备上。然而,由于文件可能相当大(200Mb+)且传输速度较慢,我需要能够从服务器(Android/PC)访问此传输过程 纳米httpd有没有办法取得这一进展?到目前为止,我似乎了解到请求完全是在调用'service()'方法之前收到的,下载也完成了。这是一个很老的问题,但

我想制作一个非常简单的服务器,既可以在Java桌面上使用,也可以在Android上使用,因此我可能会选择小型库。如果有人有更好的选择,请随意推荐

因此,服务器主要用于接收来自许多自定义WiFi设备的文件,并将一些设置推送到这些设备上。然而,由于文件可能相当大(200Mb+)且传输速度较慢,我需要能够从服务器(Android/PC)访问此传输过程


纳米httpd有没有办法取得这一进展?到目前为止,我似乎了解到请求完全是在调用'service()'方法之前收到的,下载也完成了。

这是一个很老的问题,但我想这会帮助任何人到达这里

如果您谈论的是
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);
        }
    }
}
现在,通过在
service
方法中编写此代码,您可以了解由
nanohttpd
提供服务的任何文件的进度

@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);
    }
}
要提供的文件
将是文件的路径,
mime\u文件的类型
应该是
mimetype


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

不清楚您想知道哪一方的进度。在服务器端,我想知道POST请求的进度,但我似乎已经收到了。哪一方是另一方?服务器端,还是客户端?客户端向服务器发送带有文件的POST请求,我想从服务器(例如,在nanohttpd的service()方法中)了解文件传输的进程。我不关心客户端的进展,因为它主要是一个准无头自动设备(无屏幕)。回答不错,但我建议您解释解决问题的方法,而不是提供完整的代码。尽量避免使用“将此类复制粘贴到您的代码中”这样的短语,因为这样应该是一个帮助他人开发的地方,而不仅仅是一个来复制代码的地方。
现在您是否可以了解……
缺少对象的进度?
@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);
    }
}