Java 如何保存从http响应发送的文件而不包括头文件
我正在尝试用java编写一个程序,可以从URL下载文件。我希望在不使用URLConnection的情况下执行此操作,而只是使用TCP套接字。我已经成功地发送了GET请求并获取了服务器的响应,但是如果没有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下载客户端” );
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
堆栈或ApacheHttpClient
堆栈
如果您坚持使用普通套接字进行对话,那么您需要处理/处理任何响应中的“标题”行。。。还有其他一切。。。根据HTTP规范
我想我应该以某种方式查找\r\n\r\n
,因为它在内容开始之前指示空行
是的
您还可能需要处理服务器发送的压缩响应、使用意外字符集的响应、3xx重定向等。建议不要尝试使用普通的套接字与web服务器交谈。使用一个现有的客户端HTTP堆栈;e、 g.标准的HttpUrlConnection
堆栈或ApacheHttpClient
堆栈
如果您坚持使用普通套接字进行对话,那么您需要处理/处理任何响应中的“标题”行。。。还有其他一切。。。根据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);
}
}
}