Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字从internet下载文件_Java_Sockets - Fatal编程技术网

Java 使用套接字从internet下载文件

Java 使用套接字从internet下载文件,java,sockets,Java,Sockets,我正在尝试使用java中的套接字从internet下载文件。我的程序似乎工作正常,可以编译,但当我检查文件后,它的大小为0字节。我不确定我在这方面哪里出了问题 BufferedInputStream download = new BufferedInputStream(socket.getInputStream()); FileOutputStream newFile = new FileOutputStream(fileName); output.print("GET " + address

我正在尝试使用java中的套接字从internet下载文件。我的程序似乎工作正常,可以编译,但当我检查文件后,它的大小为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循环,确保finished不等于-1,并在将数据写入文件时调用更多字节,使用:

newFile.write(input, 0, finished);
我知道我的套接字配置正确,因为我可以用它下载和读取HTTP头。我的程序从不进入while循环来写入数据,read()函数立即返回-1。我将如何着手修复我的代码

谢谢


编辑:我看到,对于使用URL类执行相同操作的答案,这被标记为重复。我无法使用URL或URLConnection。

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

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

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

您不需要在
while
循环之前初始化

两个
\n
s之间还缺少一个
\r

这就是为什么使用
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);
}

为什么描述
while
循环,而你本可以发布它?你在哪里读标题?你在哪里检查HTTP返回代码?@EJP我不认为我需要发布while循环,因为它甚至没有启动,因为“download.read(input,0,10240)”立即返回“-1”。@EJP我发布了与我的issueThanks相关的其余代码,非常感谢您的帮助!