- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个示例 java http 服务器和一个 .Net 客户端(在平板电脑上)。使用我的 http 服务器,.Net 客户端必须能够下载文件。
它工作得很好,但现在我必须能够在连接中断后恢复下载。
这里有一些代码:
Java 服务器:(它是在单独的线程中启动的,因此是 run 方法)。
public void run() {
try {
server = com.sun.net.httpserver.HttpServer.create(
new InetSocketAddress(
portNumber), this.maximumConnexion);
server.setExecutor(executor);
server.createContext("/", new ConnectionHandler(this.rootPath));
server.start();
} catch (IOException e1) {
//For debugging
e1.printStackTrace();
}
}
我的 HttpHandler :(仅处理 GET 请求的部分)
/**
* handleGetMethod : handle GET request. If the file specified in the URI is
* available, send it to the client.
*
* @param httpExchange
* @throws IOException
*/
private void handleGetMethod(HttpExchange httpExchange) throws IOException {
File file = new File(this.rootPath + this.fileRef).getCanonicalFile();
if (!file.isFile()) {
this.handleError(httpExchange, 404);
} else if (!file.getPath().startsWith(this.rootPath.replace('/', '\\'))) { // windows work with anti-slash!
// Suspected path traversal attack.
System.out.println(file.getPath());
this.handleError(httpExchange, 403);
} else {
//Send the document.
httpExchange.sendResponseHeaders(200, file.length());
System.out.println("file length : "+ file.length() + " bytes.");
OutputStream os = httpExchange.getResponseBody();
FileInputStream fs = new FileInputStream(file);
final byte[] buffer = new byte[1024];
int count = 0;
while ((count = fs.read(buffer)) >= 0) {
os.write(buffer, 0, count);
}
os.flush();
fs.close();
os.close();
}
}
现在是我的 .Net 客户端:(简化)
try{
Stream response = await httpClient.GetStreamAsync(URI + this.fileToDownload.Text);
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
// Dropdown of file types the user can save the file as
savePicker.FileTypeChoices.Add("Application/pdf", new List<string>() { ".pdf" });
// Default file name if the user does not type one in or select a file to replace
savePicker.SuggestedFileName = "new doc";
StorageFile file = await savePicker.PickSaveFileAsync();
if (file != null)
{
const int BUFFER_SIZE = 1024*1024;
using (Stream outputFileStream = await file.OpenStreamForWriteAsync())
{
using (response)
{
var buffer = new byte[BUFFER_SIZE];
int bytesRead;
do
{
bytesRead = response.Read(buffer, 0, BUFFER_SIZE);
outputFileStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
outputFileStream.Flush();
}
}
}
catch (HttpRequestException hre)
{ //For debugging
this.Display.Text += hre.Message;
this.Display.Text += hre.Source;
}
catch (Exception ex)
{
//For debugging
this.Display.Text += ex.Message;
this.Display.Text += ex.Source;
}
因此,为了恢复下载,我想在 .Net 客户端部分使用一些查找操作。但是每次我尝试诸如 response.Seek(offset, response.Position);
之类的操作时,都会发生错误,通知 Stream 不支持查找操作。是的,它没有,但是我如何指定(在我的服务器端)使用可查找流?HttpExchange.setStreams 方法有用吗?或者,我不需要修改流而是配置我的 HttpServer 实例?
谢谢。
最佳答案
很好地使用 Range、Accept-Range 和 Content-Range 字段。只需要做一点工作即可发送文件的正确部分并设置响应的 header 。
服务器可以通过设置Accept-Range字段来通知客户端它支持Range字段:
responseHeader.set("Accept-Ranges", "bytes");
然后在发送部分文件时设置 Content-range 字段:
responseHeader.set("Content-range", "bytes " + this.offSet + "-" + this.range + "/" + this.fileLength);
最后,返回码必须设置为 206(部分内容)。
有关范围、接受范围和内容范围字段的更多信息,请参阅 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
注意:Opera 12.16 使用“Range”字段来恢复下载,但 IE 10 和 Firefox 22 似乎不使用该字段。可能是我最初寻找的一些可搜索流。如果有人对此有答案,我会很高兴阅读它 =)。
关于java - HttpServer - HttpExchange - 可查找流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062088/
我正在使用我的服务器分发一些文件(在 zip 中),但是,我希望用户在能够下载文件之前输入验证码。 这带来了一个新问题,因为代码: private void sendFileResponse(
我正在创建在 Java HttpServer 类上运行的服务器,一切正常,但我注意到调用 exchange.getRemoteAddress().getAddress().getCanonicalHo
我创建了一个基于 com.sun.net.httpserver.HttpExchange 的 HttpServer。在我的处理程序中,com.sun.net.httpserver.HttpHandle
我正在开发一个示例 java http 服务器和一个 .Net 客户端(在平板电脑上)。使用我的 http 服务器,.Net 客户端必须能够下载文件。 它工作得很好,但现在我必须能够在连接中断后恢复下
我正在尝试修改一些使用 httpExchange 对象来处理服务器对客户端的响应的服务器代码。 我的问题是,对于包含 iso-8859-1 不支持的字符(例如汉字)的响应,我会得到类似于“????”的
我正在尝试通过 jetty 文档中的此链接实现“异步交换”下的代码: http://wiki.eclipse.org/Jetty/Tutorial/HttpClient#Asynchronous_Ex
这似乎是一个如此常见的用例,应该有一个简单的解决方案,但我看到的每一处都充满了极其臃肿的例子。 假设我有一个如下所示的表单: 我提交它并在服务器上想要获取输入值: 在服务器上,
原始 URI 是(比方说):http://xx.xx.xxx.xx:8000/mypath?parm1=1&parm2=he getRequestURI 返回:http://xx.xx.xxx.xx:
首先一些(非常基本的)示例代码来说明我的问题: final java.util.concurrent.atomic.AtomicLong previousId = new java.util.conc
我正在尝试用 Java 创建一个简单的 HttpServer 来处理 GET 请求,但是当我尝试获取请求的 GET 参数时,我注意到 HttpExchange 类没有相应的方法。 有人知道读取 GET
我有两个从客户端到服务器的 HttpURLConnections。这不是典型的 HttpServer,我正在对客户端和服务器进行编码,但只能使用端口 80/443(用于测试任何端口是否有效)。第一个请
我是一名优秀的程序员,十分优秀!