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