-4

我使用以下代码使用套接字而不是 url.openconnection() 从指定的 url 下载文件;下载后,当我检查它不起作用时...当我用编辑器打开文件时,它完全是空白的,文件内没有数据(空文件)需要建议???... ...

try {

    String address="http://tineye.com/images/widgets/mona.jpg";
    URL url_of_file=new URL(addres);
    String hostaddress=url_of_file.getHost();
    Socket mysocket=new Socket(hostaddress, 80);
    System.out.println("Socket opened to " + hostaddress + "\n");
    String file=url_of_file.getFile();
    System.out.println(" file = "+file);

    OutputStreamWriter osw=new OutputStreamWriter(mysocket.getOutputStream());

    osw.write("GET " + file + " HTTP/1.0\r\n\n"); 
    osw.flush(); 

    dis = new DataInputStream(mysocket.getInputStream());
    fileData = new byte[7850];

    for (int x = 0; fileData[x] > 0; x++){
         fileData[x] = (byte) dis.read();
    }

     // close the data input stream
    fos = new FileOutputStream(new File("C:\\Users\\down-to\\filedownloaded.jgp"));  //create an object representing the file we want to save
    fos.write(fileData);  // write out the file we want to save.
    dis.close();
    fos.close();

} catch (UnknownHostException ex) {
    Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
} 
4

5 回答 5

5

这是:

for(int x=0;fileData[x]>0;x++){

正确的 ?看起来您正试图根据流的内容进行中断。正如 Flavio 所指出的,由于数组是新创建的,因此该语句立即为假。

我认为您更有可能阅读指示的内容长度,或者直到到达流的末尾。

事实上,我更愿意使用现有的HttpClient并绕过上述所有内容。编写可靠的 HTTP 代码并不像第一次出现那样简单,第 3 方库将为您省去很多麻烦。

于 2012-07-26T09:04:56.790 回答
1

你做错了几件事。首先,它是在重新发明轮子,因为已经存在很多 HTTP 库。

然后你正在制作一个无效的 HTTP 请求。就像 HTTP 1.1 一样,此类请求的标头应该以 结束\r\n,而您只发送\n

osw.write("GET " + file + " HTTP/1.0\r\n\n"); 

服务器可能会等到您完成您的请求(它仍在等待一个完整的请求,以 double 结束\r\n)或抛出错误,因为它不希望出现第二个\n

那么您就不会读取响应标头,这可能表明期望有多少数据。有趣的是,您初始化了一个足够大的字节数组(您要下载的文件是 7850 字节大),但是您不能对网络上的每个文件的文件大小进行硬编码,因为您很快就会用完存储磁盘空间他们。

因此,要么读取并解析Content-length标头,要么等待服务器在发送所有数据后关闭连接(这是HTTP 1.0中的两个选项)。

最后,正如其他人所指出的那样,您没有正确阅读响应。请修复这些基础知识,然后您可以尝试存储响应。现在你的文件被零填充了。

于 2012-07-26T09:52:18.677 回答
0

通过如下修改您的代码,我能够用数据填充文件,这就是我得到的:

错误:拒绝访问

错误

拒绝访问


  • 访问被安全策略拒绝

您的网络的安全策略此时不允许您的请求。如果您认为这不正确,请联系您的管理员。

try {
    String address = "http://tineye.com/images/widgets/mona.jpg";
    URL url_of_file = new URL(address);
    String hostaddress = url_of_file.getHost();
    Socket mysocket = new Socket(hostaddress, 80);
    System.out.println("Socket opened to " + hostaddress + "\n");
    String file = url_of_file.getFile();
    System.out.println(" file = " + file);

    OutputStreamWriter osw = new OutputStreamWriter(mysocket.getOutputStream());

    osw.write("GET " + file + " HTTP/1.0\r\n\n");
    osw.flush();

    DataInputStream dis = new DataInputStream(mysocket.getInputStream());
    byte[] fileData = new byte[7850];
    FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\aboutros\\Desktop\\filedownloaded.jgp")); // create an object representing the file we want to save

    while (dis.read(fileData) >= 0) {
        fos.write(fileData); // write out the file we want to save.
    }
    dis.close();
    fos.close();

} catch (UnknownHostException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}
于 2012-07-26T09:15:29.100 回答
0

条件是什么意思for

for(int x=0;fileData[x]>0;x++){

刚刚创建了 fileData 数组,因此它用零填充。fileData[x]>0立即为假。

于 2012-07-26T09:03:48.783 回答
0

这个条件正确吗?如果是,这种情况背后的含义是什么?

for(int x=0;fileData[x]>0;x++)
于 2012-12-24T13:22:08.823 回答