我正在尝试用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响应的文件。
答案 0 :(得分:3)
建议的方法是不要尝试使用普通Socket
与Web服务器通信。使用现有的客户端HTTP堆栈之一;例如标准HttpUrlConnection
堆栈或Apache HttpClient
堆栈。
如果您坚持使用普通套接字进行通信,那么您可以根据HTTP规范处理/处理任何响应中的“Header”行......以及其他所有内容。
我想我应该以某种方式寻找
\r\n\r\n
因为它在内容开始之前表示空行。
是的......
您还可能需要处理发送压缩响应的服务器,使用意外字符集的响应,3xx重定向等等。