`
喜马拉雅上的小草
  • 浏览: 50435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 使用http协议下载文件

阅读更多
 1.HTTP协议工作方式

  基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、获取服务器响应状态、关闭连接。其中较为复杂的过程是:发送请求信息、获取服务器响应状态.

  1)向服务器发送请求信息

  一个HTTP请求由一个请求行、可选数目的请求标题、一个空白行,以及在POST情况下的一些额外的数据组成。请求行的格式是:

  Method Request-URI HTTP-Vsersion CRLF

  Method表示请求方法,如GET和POST

  Request-URI标识了要请求的资源,

  HTTP-Version表示请求的HTTP协议版本,

  CRLF表示回车换行。

  HTTP请求报文格式如下:

  HTTP Command:       //方法字段(GET方法,POST方法)

  URI:                //URL字段,发送请求至保存该网站的服务器。

  HTTP Version:       //http协议版本字段

  Accept:             //指示可被接受的请求回应的介质类型范围列表。

  Accept-Language:    //限制了请求回应中首选的语言为简体中文,否则使用默认值。

  Accept-Encoding:    //限制了回应中可接受的内容编码值

  User-Agent:         //定义用户代理,即发送请求的浏览器类型

  Host:               //定义了目标所在的主机

  Connection:         //告诉服务器使用连接类型

  2)获取服务器响应状态

  在发送HTTP请求行以后,程序就可以读取服务器的响应状态了。HTTP响应状态行包括:HTTP 状态码和一些HTTP响应标题。

  HTTP回应报文

  HTTP Version: HTTP/1.1       //服务器用的是HTTP/1.1版本

  HTTP Status: 200             //请求成功,信息可以读取,包含在响应的报文中

  Date:                        //响应报文的时间

  Server:                      //响应报文的服务器

  X-Powered-By:                //表明运行环境

  Set- cookie:                 //

  Vary:                        // 来
 Content-Length:             //表明实体的长度

  Connection:                 //告诉客户机在报文发送完毕后连接的状态

  Content-Type:              //表明实体中的对象类型(html文档)

  Binary Data:              //二进制数据

  状态码表示响应类型,常用的有:

  1××  保留

  2××  表示请求成功地接收

  3××  为完成请求客户需进一步细化请求

  4××  客户错误

  5××  服务器错误

  在程序中间,如果读到“HTTP/1.1 200 OK”这样的字符串,表明欲下载文件存在、该服务器支持断点续传,可以使用多线程下载。如果读到“HTTP/1.0 200 OK”这样的字符串,表明欲下载文件存在、但该服务器不支持断点续传,只可以使用单线程下载。


import java.io.IOException;   
import java.io.InputStream;   
import java.io.RandomAccessFile;   
import java.net.HttpURLConnection;   
import java.net.URL;   
  
public class HttpDownloadFile {   
 public static void main(String[] args) {   
  String sURL = "http://10.21.243.139:8080/gis/file/bou1_4l.shp";   
  int nStartPos = 0;   
  int nRead = 0;   
  String sName = "bou1_4l.shp";   
  String sPath = "c:\\temp";   
  try {   
   URL url = new URL(sURL);   
   // 打开连接   
   HttpURLConnection httpConnection = (HttpURLConnection) url   
     .openConnection();   
   // 获得文件长度   
   long nEndPos = getFileSize(sURL);   
   RandomAccessFile oSavedFile = new RandomAccessFile(sPath + "\\"  
     + sName, "rw");   
   httpConnection   
     .setRequestProperty("User-Agent", "Internet Explorer");   
   String sProperty = "bytes=" + nStartPos + "-";   
   // 告诉服务器book.rar这个文件从nStartPos字节开始传   
   httpConnection.setRequestProperty("RANGE", sProperty);   
   System.out.println(sProperty);   
   InputStream input = httpConnection.getInputStream();   
   byte[] b = new byte[1024];   
   // 读取网络文件,写入指定的文件中   
   while ((nRead = input.read(b, 0, 1024)) > 0 && nStartPos < nEndPos) {   
    oSavedFile.write(b, 0, nRead);   
    nStartPos += nRead;   
   }   
   httpConnection.disconnect();   
  } catch (Exception e) {   
   e.printStackTrace();   
  }   
 }   
  
 // 获得文件长度   
 public static long getFileSize(String sURL) {   
  int nFileLength = -1;   
  try {   
   URL url = new URL(sURL);   
   HttpURLConnection httpConnection = (HttpURLConnection) url   
     .openConnection();   
   httpConnection   
     .setRequestProperty("User-Agent", "Internet Explorer");   
  
   int responseCode = httpConnection.getResponseCode();   
   if (responseCode >= 400) {   
    System.err.println("Error Code : " + responseCode);   
    return -2; // -2 represent access is error   
   }   
   String sHeader;   
   for (int i = 1;; i++) {   
    sHeader = httpConnection.getHeaderFieldKey(i);   
    if (sHeader != null) {   
     if (sHeader.equals("Content-Length")) {   
      nFileLength = Integer.parseInt(httpConnection   
        .getHeaderField(sHeader));   
      break;   
     }   
    } else  
     break;   
   }   
  } catch (IOException e) {   
   e.printStackTrace();   
  } catch (Exception e) {   
   e.printStackTrace();   
  }   
  System.out.println(nFileLength);   
  return nFileLength;   
 }   
}  
分享到:
评论

相关推荐

    java使用HttpClient通过url下载文件到本地

    综上所述,通过Java的HttpClient库,可以在Eclipse环境中编写程序,实现从指定URL下载文件到本地的功能。通过理解HttpClient的工作原理和提供的API,开发者可以构建出稳定、高效的文件下载解决方案。

    java实现CMPP协议

    6. **测试与调试**:在开发过程中,可以使用_cmpp3.0_文件中的样例数据进行单元测试,模拟SMSC的响应,确保协议实现的正确性。此外,日志记录也是必不可少的,它可以帮助开发者在出现问题时快速定位和解决问题。 7....

    java调用snmp协议

    **文件名称解析:** "Java进行SNMP通信的指南SnmpProgrammingGuideViaJava.doc" 这个文档很可能是教程性质的,它将指导读者如何使用Java进行SNMP通信,可能包含以下内容: - SNMP协议的基础知识:包括SNMP的工作原理...

    Xmodem和Ymodem 传输协议JAVA实现

    通过阅读源码,你可以了解如何在实际项目中应用这些协议,也可以学习到Java串行通信和文件传输的技巧。 总之,Xmodem和Ymodem协议虽然在现代高速网络环境下已不再常见,但它们代表了早期计算机通信技术的重要部分。...

    电信SMGP协议java实现

    在Java环境下实现SMGP协议,可以为开发者提供与电信运营商进行短信通信的能力,比如用于验证码发送、通知服务等场景。本项目提供了Java版本的SMGP协议实现,且附带了示例代码,方便开发者快速理解和应用。 **1. ...

    使用java实现Xmodem协议

    Java实现Xmodem协议主要涉及的是串口通信和数据传输中的错误检测与纠正技术。Xmodem协议是一种早期的文件传输协议,它主要用于通过慢速的串行通信线路进行数据传输,例如调制解调器连接。在Java中实现Xmodem协议,...

    Java实现HTTP文件下载

    根据给定的文件信息,以下是对“Java实现HTTP文件下载”的详细知识点解析: ### Java实现HTTP文件下载 #### 核心概念与流程 在互联网环境中,我们经常需要从远程服务器下载资源,这些资源通常通过URL(Uniform ...

    Java对Samba进行上传与下载文件-jcifs

    Java对Samba进行上传与下载文件的技术主要涉及Java编程、Samba服务器以及jcifs库的使用。Samba是一个开源软件,允许Linux/Unix系统与Windows系统之间进行文件共享,而jcifs是Java的一个库,它提供了对SMB(Server ...

    java访问https网址下载文件

    以上就是使用Java访问HTTPS网址并下载文件的基本步骤,包括处理可能需要的证书下载。需要注意的是,实际生产环境中,为了安全起见,不应使用信任所有证书的策略,而是应该确保服务器的证书被正确配置并由受信任的CA...

    java 实现 icmp协议测试

    java 实现 icmp协议测试 需要在java lib目录下添加libjpcap.so文件

    基于Java的808协议网关设计源码

    808协议网关:基于Java开发,包含202个文件,其中176个Java源文件,用于实现协议解析和网关功能。系统支持TCP和UDP协议,动态兼容2011、2013、2019版本协议,并支持数据分包。此外,系统还支持JT/T1078音视频协议、T...

    java访问https网址下载文件(含证书)

    在Java编程中,访问HTTPS网址并下载文件是一个常见的任务,特别是在需要安全传输敏感数据或确保数据完整性时。这里我们将深入探讨如何使用Java 1.7版本处理这一过程,包括处理SSL证书。 首先,理解HTTPS(超文本...

    Java 使用Tcpip 发送XML文件

    本项目关注的是如何使用Java通过TCP/IP协议发送XML文件。TCP/IP(Transmission Control Protocol/Internet Protocol)是一种通信协议,是互联网的基础,确保数据在不同网络间的可靠传输。 首先,我们需要了解Java中...

    Java实现FTP批量大文件上传下载

    本文介绍了如何使用 Java 实现 FTP 服务器上的大批量文件的上传和下载,处理大文件的上传和下载。通过 Java 现有的可用的库来编写 FTP 客户端代码,并开发成 Applet 控件,做成基于 Web 的批量、大文件的上传下载...

    Java 解析国标hj212协议

    7. **网络通信**:为了接收和发送hj212协议的数据,开发者可能使用Java的Socket编程或者HTTP客户端库,如HttpURLConnection、Apache HttpClient等,来实现网络连接和数据交换。 8. **异常处理**:在网络通信和数据...

    telnet.rar telnet 协议 客户端 源代码 java

    《telnet协议与Java客户端源代码解析》 在IT领域,网络通信协议是构建网络应用的基础,其中telnet协议作为一款历史悠久的远程登录协议,它为用户提供了在不同主机之间进行交互的能力。本文将深入探讨telnet协议的...

    Java向苹果服务器推送消息(Java实现HTTP/2协议发送APNS)

    本教程将重点讲解如何使用Java实现基于HTTP/2协议的APNS推送,并假设你已经对JDK 11及以上版本有一定的了解。 首先,理解APNs的工作原理至关重要。APNs是一个基于TCP的推送服务,它接受开发者发送的消息并将其分发...

    Java实现opc通信协议代码

    Java实现OPC通信协议主要涉及的是Java编程语言与OPC(OLE for Process Control)技术的结合,这是一种在工业自动化领域广泛使用的数据交换标准。在Java中实现OPC通信,通常需要借助于一些开源库或者商业组件,这些库...

    JAVA下载远程Linux服务器的文件

    在Java编程中,有时我们需要与远程Linux服务器进行交互,例如下载或上传...总之,通过Java结合jcifs库,我们可以轻松地实现在Linux服务器上执行SMB协议,进行文件的下载和上传,这对于跨平台的文件操作需求非常有用。

Global site tag (gtag.js) - Google Analytics