APP下载

基于OkHttp的文件传输设计与实现

2018-02-28李群

电子技术与软件工程 2018年13期
关键词:面向对象

李群

摘要 OkHttp是一种面向HTTP客户端的JAVA平台开发库,具有网络访问高效稳定、易于开发等特性。通过对OkHttp开发库的分析,提出了基于OkHt tp的文件传输接口的设计方法。使用本文实现的接口,可以方便快捷地完成各类文件传输的需求。

【关键词】文件传输 面向对象 HTTP

1 引言

伴随着各行业管理网络化和自动化的逐步深入,本单位对各类电子文件通过网络进行传输的需求日益增强。在本单位现有局域网带宽有限的情况下,高效稳定传输文件是急需解决的一项工作。

文件传输(File transfer)指将一个文件或其中一部分通过网络从一个计算机系统传到另一个计算机系统,用于存储、远程访问、运行或者打印等各项处理任务。由于网络中各个计算机的文件系统往往并不相同,因此,通常要采用某一网络应用层协议作为公用的文件传输规则。目前,常用的文件传输协议主要包括文件传输协议(FTP)和超文本传输协议(HTTP)。相较而言,HTTP更适合同时传输多个文件等应用场景,是本文所采用的文件传输协议。各大公司针对HTTP协议提供了多种开发库,例如面向C/C++的Boost.Asio、面向Python的Twisted等。本文介绍的工作基于面向Java的OkHttp,确保所开发的文件传输模块具有跨平台能力。

2 0kHttp

2.1 0kHttp简介

OkHttp是由Square公司提供的一种面向HTTP客户端的开发库。OkHttp处理HTTP协议的特点如下:

(1)支持HTTP/2和SPDY,允许同一主机共享一个套接字的所有请求;

(2)当SPDY不可用,连接池可降低请求延迟;

(3)透明GZIP可降低下载量;

(4)响应缓存可避免重复的请求;

(5)同时支持同步阻塞调用和基于回调的异步调用。通过使用OkHttp,开发者在实现网络应用时可大大减少所需的步骤。开发者无需关注网络测试、从常见连接问题中恢复;在连接失败时,OkHttp可以尝试不同的路由重新请求。OkHttp通过创建共享内存池,提高读写数据的速度。此外,作为Retrofit库的底层库,OkHttp为使用基于REST的API提供了类型安全性。若需使用OkHttp,Java的最低版本要求为1.7。

2.2 0kHttp核心类

使用OkHttp开发库,首先必须了解该库所提供的核心类。

(1) OkHttpClient类对HTTP客户端进行管理,接受请求(request)并产生对应的响应(response)。所有的HTTP客户端都在OkHttpClient中配置,包括代理设置、超时和缓存等。在使用OkHttp时,应尽量建立单个OkHttpClient实例用于HTTP调用,以获得最佳性能。其原因在于,每个客户端维护自己的连接池和线程池,连接和线程的重用可降低延迟并节省内存。如果为每个请求创建一个客户端,会导致空闲池上的资源浪费。

(2) Request类表示HTTP请求。该类采用生成式设计模式构建实例,用来设置复杂参数,示例如下:

Request request= new Request.Builder()url(”http://www.baidu.com”).build();

(3)Response类表示HTTP响应。通过isSuccessful()方法判断请求是否成功。对于成功的响应,可以通过body()以及header()方法获取HTTP响应的内容。

(4) Call類是表示已经准备完毕等待执行的请求。Call请求可以被取消。此外,由于Call对象表示单个请求/响应对,因此无法被执行两次。

3 文件传输设计

根据上节所介绍的OkHttp使用方法,结合日常文件传输的需求,本文设计了一套基于OkHttp的文件传输接口,便于二次开发。

3.1 HTTP请求过程

使用OkHttp进行网络请求的步骤归纳为以下四点:

(1)创建一个OkHttpClient实例;

(2)创建一个Request实例;

(3)使用OkHttpClient创建一个Call并执行,获取一个Response对象;

(4)对Response进行相关操作。通过以上四个步骤,一个应用可以完成各种情况下的网络访问。

其中,在步骤3的执行过程中,可以根据同步或者异步需求,分别采用execute()方法或者enqueue()方法,实现不同的访问策略。在步骤2创建Request实例时,用户可以根据需要发起Post请求或者Get请求。Post或者Get是HTTP协议中向后台服务器发送数据的一种机制,是HTTP协议的一个组成部分。Post请求将要提交到后台服务器的数据放在HTTP包的包体中,Get请求将数据放在URL之后。相较而言,Post请求方式更加安全,而Get请求方式更加便捷。

3.2 文件传输类设计

由于基于OkHttp文件传输过程既具有统一性又具有差异性,本文在设计类时,采用了抽象类(Abstract class)及其派生子类的方法。抽象类用于创建体现某些基本行为的类,并为该类声明方法但不能在该类中实现。通过抽象类,描述基于OkHttp文件传输的基本步骤,体现传输行为的统一性。通过抽象类派生的子类,实现同步传输或者异步传输,体现传输行为的差异性。本文设计的文件传输类继承结构如图1所示。

每个类的具体说明如下:

(1) OkHttpTransfer类为抽象父类,负责定义文件传输相关的方法。该类拥有一个HTTP客户端实例,定义为protected finalOkHttpClient client,通过该实例管理所有HTTP的传输。该类的核心方法如表l所示。

OkHttpTransfer类对传输过程进行了实现。其中runDownlaod的实现核心代码为:

Thread myThread= new Thread(newRunnable(){

public void run(){

Request request= new Request.Builder().url(targetUrl).build();

callWith(request);

});

myThread.start();

runUpload方法与runDownlaod方法类似;不同之处是由于文件较大,采用post方法生成Request。

(2) SynchronousTransfer类, 派生自OkHttpTransfer类,实现了同步传输的Call执行。在该类里,具体实现了caIIWith方法,调用了Call类的execute方法,关键代码如下:

try{

Response response= client.newCall(request).execute();

if (fresponse.isSuccessful(》

throw newIOException(”Unexpected code”+response);

analyzeResponse(response);

} catch (Exception e)

(3) AsynchronousTransfer類在实现callWith方法时,则调用了Call类的enqueue方法,关键代码如下:

client.newCall(request).enqueue(newCallback(){

public void onFailure(Call call,IOException e)……

public void onResponse(Call call,Response response) throws IOException{

try{

if (!response.isSuccessful(》

throw newIOException(”Unexpected code”+response);

analyzeResponse(response);

} catch (Exception e)

}

));

在使用时,用户根据需求生成SynchronousTransfer或者AsynchronousTransfer实例,调用runDownlaod方法或者runUpload方法,实现不同的文件传输策略,接口简洁易用。

4 结语

本文介绍了一种基于OkHttp客户端的文件传输接口设计与实现。OkHttp开发库具有网络访问高效稳定、易于开发等特性。本文针对文件传输的需求,对OkHttp开发库提供的类和方法进行了封装,使得文件传输过程可被复用,接口调用简洁。

参考文献

[1] Bruce Eckel.Java编程思想[M],北京:机械工业出版社,2007.

[2] Elliotte Rusty Harold。Java网络编程[M].北京:中国电力出版社,2014.

[3][ al上野·宣,图解HTTP [M].北京:人民邮电出版社,2014.

猜你喜欢

面向对象
面向对象方法在水蓄冷PLC编程中应用分析
基于python的面向对象传感器库类抽象方法
面向对象的计算机网络设计软件系统的开发
面向对象的数据交换协议研究与应用
面向对象Web开发编程语言的的评估方法
基于面向对象的Office评测系统的分析
峰丛洼地农作物面向对象信息提取规则集
基于E-cognition的面向对象的高分辨率遥感图像分类研究
基于面向对象的车辆管理软件的研制与开发
面向对象的SoS体系结构建模方法及应用