java - 如何保存从 http 响应发送的文件而不包含 header

标签 java file http get httpresponse

我正在尝试用java编写一个程序,它能够从URL下载文件。我想在不使用 URLConnection 的情况下执行此操作,而是仅使用 TCP 套接字。我已成功发送 GET 请求并获取服务器的响应,但我似乎无法在没有 http header (仅文件)的情况下从响应中保存文件。

import java.net.*;
import java.io.*;

public class DownloadClient {
    public static void main(String[] args) {
        try {
            if (args.length != 3) {
                System.out.println(
                    "Use: java DownloadClient <host> <port> <filename/path>"
                );
            } else {
                // Sorting out arguments from the args array
                String host;
                int port; 
                String filename;
                if (args[0].charAt(args[0].length()-1) == '/') {
                    host = args[0].substring(0,args[0].length()-1);
                } else {
                    host = args[0];
                }
                port = Integer.parseInt(args[1]);
                if (args[2].charAt(0) == '/') {
                    filename = args[2];
                } else {
                    filename = "/"+args[2];
                }

                Socket con = new Socket(args[0], Integer.parseInt(args[1]));

                // GET request
                BufferedWriter out = new BufferedWriter(
                    new OutputStreamWriter(con.getOutputStream(), "UTF8")
                );
                out.write("GET "+filename+" HTTP/1.1\r\n");
                out.write("Host: "+host+"\r\n");
                out.write("User-Agent: Java DownloadClient\r\n\r\n");
                out.flush();

                InputStream in = con.getInputStream();
                BufferedReader = 
                OutputStream outputFile = new FileOutputStream(
                    filename.substring(filename.lastIndexOf('/')+1)
                );
                byte[] buffer = new byte[1024];
                int bytesRead = 0;

                while((bytesRead = in.read(buffer)) > 0) {
                    outputFile.write(buffer, 0, bytesRead);
                    buffer = new byte[1024];
                }

                outputFile.close();
                in.close();
                con.close();
            }
        } catch (IOException e) {
            System.err.println(e); 
        }
    }
}

我想我应该以某种方式寻找\r\n\r\n 因为它表示内容开始之前的空行。到目前为止,该程序创建了一个包含所有 http 响应的文件。

最佳答案

推荐的方法是不要尝试使用普通的Socket与网络服务器通信。使用现有的客户端 HTTP 堆栈之一;例如标准 HttpUrlConnection 堆栈或 Apache HttpClient 堆栈。

如果您坚持使用普通套接字进行通信,那么您需要根据 HTTP 规范来处理/处理任何响应中的“ header ”行...以及其他所有内容...

I guess that I should somehow look for \r\n\r\n as it indicates the empty line just before the content begins.

是的...

您还可能需要处理服务器发送压缩响应、使用意外字符集的响应、3xx 重定向等。

关于java - 如何保存从 http 响应发送的文件而不包含 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797665/

相关文章:

java - 文件名java中的特殊字符

html - Firefox 可以显示 JP2 图像吗?

java - 使用移动平台的套接字在java中实现实时聊天应用程序好吗?

java - 原始数据解析

文件在 Go 中既存在又不存在?

node.js - 修改代理请求的 header

http - 为什么浏览器不遵循呈现的 GitHub README.md 上图像资源的 HTTP 302 重定向?

java - 法语字符编码问题 è 在 java 中显示为 è

java - 使用 Struts 2 填充组合框时出现问题

java - 在 Java 中为 GC 提供更多 CPU 时间?