使用套接字从Internet下载文件

时间:2015-10-09 20:57:33

标签: java sockets

我正在尝试使用java中的套接字从互联网上下载文件。我的程序似乎正常工作并编译,但当我去检查文件后,然后它的0字节大小。我不确定我在哪里出错了。

BufferedInputStream download = new BufferedInputStream(socket.getInputStream());
FileOutputStream newFile = new FileOutputStream(fileName);
output.print("GET " + address + " HTTP/1.0\r\n\n");
output.flush();
byte[] input = new byte[10240];
int finished = download.read(input, 0, 10240);

然后我有一个while循环,确保finish不等于-1并在使用以下方法将数据写入文件时调用更多字节的数据:

newFile.write(input, 0, finished);

我知道我的套接字配置正确,因为我可以下载并读取HTTP标头。我的程序从不进入while循环来写入数据,read()函数立即返回-1。我该如何修复我的代码?

谢谢!

编辑:我看到这个被标记为重复的答案使用了URL类来做同样的事情。我不能使用URL或URLConnection。

1 个答案:

答案 0 :(得分:2)

您没有正确阅读标题。您需要阅读它们,直到得到一个空行,而不是空行。当您只是尝试读取标题时,您正在读取整个响应,因此在第二部分中没有剩余的响应正文。

但是BufferedReader还有另一个问题。它可能会从以下机构窃取数据。这是DataInputStream.readLine()的罕见情况,是的,我知道它已被弃用。

您也没有检查是否有HTTP错误代码,这意味着响应中没有正文。

您无需在line循环之前初始化while

您在两个\r之间也缺少\n

所有这些都是为什么最好使用HttpURLConnection,如果你不能,那就是为什么它不是一个好的任务。

编写这些循环的简便方法是:

// headers
while ((line = in.readLine()) != null
{
    if (line.length() == 0)
        break; // end of headers
    // ...
}

// body
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}