我想制作一个可以在Java Desktop和Android上使用的非常简单的服务器,因此我可能会选择小型图书馆NanoHttpd。如果有人有更好的选择,请随时推荐。
因此,该服务器主要用于来自许多自定义WiFi专用设备的文件接收,并用于向其推送一些设置。但是,由于文件可能很大(200Mb +)并且传输速率很慢,所以我需要能够从服务器(Android / PC)访问此传输的进度。
NanoHttpd是否有办法获得这一进展?到目前为止,我似乎已经了解到,在调用“ serve()”方法并完成下载之前,请求已完全收到。
答案 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
。
现在,您可以根据需要修改此样板代码。希望对大家有帮助。