Java 如何保存从http响应发送的文件而不包括头文件

Java 如何保存从http响应发送的文件而不包括头文件,java,file,http,get,httpresponse,Java,File,Http,Get,Httpresponse,我正在尝试用java编写一个程序,可以从URL下载文件。我希望在不使用URLConnection的情况下执行此操作,而只是使用TCP套接字。我已经成功地发送了GET请求并获取了服务器的响应,但是如果没有http头(只是文件),我似乎无法从响应中保存文件 import java.net.*; 导入java.io.*; 公共类下载客户端{ 公共静态void main(字符串[]args){ 试一试{ 如果(参数长度!=3){ System.out.println( “使用:java下载客户端” );

我正在尝试用java编写一个程序,可以从URL下载文件。我希望在不使用URLConnection的情况下执行此操作,而只是使用TCP套接字。我已经成功地发送了GET请求并获取了服务器的响应,但是如果没有http头(只是文件),我似乎无法从响应中保存文件

import java.net.*;
导入java.io.*;
公共类下载客户端{
公共静态void main(字符串[]args){
试一试{
如果(参数长度!=3){
System.out.println(
“使用:java下载客户端”
);
}否则{
//从args数组中排序参数
字符串主机;
国际港口;
字符串文件名;
如果(args[0].charAt(args[0].length()-1)=='/'){
host=args[0]。子字符串(0,args[0]。长度()-1);
}否则{
host=args[0];
}
port=Integer.parseInt(args[1]);
if(args[2]。字符(0)=='/')){
filename=args[2];
}否则{
filename=“/”+args[2];
}
套接字con=新套接字(args[0],Integer.parseInt(args[1]);
//获取请求
BufferedWriter out=新的BufferedWriter(
新的OutputStreamWriter(con.getOutputStream(),“UTF8”)
);
out.write(“GET”+filename+“HTTP/1.1\r\n”);
out.write(“主机:“+Host+”\r\n”);
write(“用户代理:Java DownloadClient\r\n\r\n”);
out.flush();
InputStream in=con.getInputStream();
BufferedReader=
OutputStream outputFile=新文件OutputStream(
filename.substring(filename.lastIndexOf('/')+1)
);
字节[]缓冲区=新字节[1024];
int字节读取=0;
而((bytesRead=in.read(buffer))>0){
write(缓冲区,0,字节读取);
缓冲区=新字节[1024];
}
outputFile.close();
in.close();
con.close();
}
}捕获(IOE异常){
系统错误println(e);
}
}
}

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

建议不要尝试使用普通的
套接字与web服务器通信。使用一个现有的客户端HTTP堆栈;e、 g.标准的
HttpUrlConnection
堆栈或Apache
HttpClient
堆栈

如果您坚持使用普通套接字进行对话,那么您需要处理/处理任何响应中的“标题”行。。。还有其他一切。。。根据HTTP规范

我想我应该以某种方式查找
\r\n\r\n
,因为它在内容开始之前指示空行

是的


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

建议不要尝试使用普通的
套接字与web服务器交谈。使用一个现有的客户端HTTP堆栈;e、 g.标准的
HttpUrlConnection
堆栈或Apache
HttpClient
堆栈

如果您坚持使用普通套接字进行对话,那么您需要处理/处理任何响应中的“标题”行。。。还有其他一切。。。根据HTTP规范

我想我应该以某种方式查找
\r\n\r\n
,因为它在内容开始之前指示空行

是的


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

确切地说,如果您想要滚动自己的HTTP堆栈,您必须遵循RFC:确切地说,如果您想要滚动自己的HTTP堆栈,你必须遵循RFC:我正在学习网络技术课程,所以实际上这只是一个实验。但是我如何才能准确地查找\r\n\r\n?我对编程相当陌生,刚从今年夏天开始。您需要检查字节(在读取字节时或在将字节写入文件之前),并查找表示“\r\n\r\n”的字节序列。这只是编程…我正在学习网络技术课程,所以实际上这只是实验性的。但是我如何才能准确地查找\r\n\r\n?我对编程相当陌生,刚从今年夏天开始。您需要检查字节(在读取字节时或在将字节写入文件之前),并查找表示“\r\n\r\n”的字节序列。这只是编程。。。
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); 
        }
    }
}