基于Hessian协议的文件传输系统的研究与应用

2022-09-07 05:05
现代计算机 2022年13期
关键词:服务器端序列化二进制

周 琴

(四川省科学技术信息研究所,成都 610016)

0 引言

互联网时代,文件传输服务已是Web 应用系统的重要功能之一,用于完成信息的交互和共享。无论是企业的信息系统、还是电子政务系统、电子商务系统等,随着应用规模的扩大,文件传输需求越来越多,要求越来越高,任务并发情况也越来越频繁。而文件上传/下载效率很容易受到文件大小和网络带宽影响,经常因为文件过大或者网络中断导致传输失败,不得不重新传输。另外,文件传输服务作为一个常见的功能模块,不同应用之间存在重复开发的问题,增加了系统开发成本。同时,开发者在实际开发过程中容易忽视它的重要性,导致文件传输的效率低下,传输的安全性和可靠性得不到保证。如何在高并发环境中实现大文件稳定、安全、可靠的传输是Web 应用系统开发需要考虑的重要问题。

1 系统分析

针对上述问题,本文基于Hessian 协议框架研发一套通用的文件传输服务系统,能够为外部网络应用提供高性能的独立的文件传输和文件加工处理服务,实现文件传输和加工处理与外部网络应用相互独立,可跨平台用于不同网络环境中。本文将文件分片传输,可解决因文件过大导致传输失败的问题。通过建立统一规范的文件传输服务接口,供不同外部应用访问,这样能简化Web 应用系统的设计并快速进行开发,同时也解决了不同应用之间重复开发相同功能模块的问题。Web 应用系统通过访问通用的接口与文件传输服务系统进行交互,告知文件传输服务系统将要传输的文件的源地址和目的地址,以及加工处理的具体任务。文件服务系统通过接口接收指令,独立完成任务后,将文件传输服务状态反馈给接口,Web 应用系统通过接口来实时查看文件传输服务状态。

2 关键技术

2.1 Hessian协议框架

在OSI网络通信模型中,RPC协议跨越了传输层和网络层,使得开发高可用的分布式应用程序更加容易。近年来,基于RPC 协议的远程服务调用在分布式项目中应用越来越广泛,比如谷歌的gRPC、Facebook 的Thrift、阿里巴巴的Dubbo、新浪的Montan 以及Hessian、Avro、Ice等,各个框架都有其各自的优缺点。本文选取Hessian 协议作为文件传输系统的远程通信架构,实现系统之间的数据传送。它具有传输开销小、网络带宽利用率高、数据传递效率高的特点,能很好地满足文件传输的数据通信需求。

Hessian 是由Caucho 公司开发的一种基于二进制RPC 协议(Binary-RPC)的轻量级远程调用框架,采用自定义描述的二进制传输协议,很适合发送二进制数据,利用它可以快速地开发Web 服务,不需要构建大型的框架,也不需要其它协议的支持。它的优点是能够使得不同节点之间文件的传输变得非常的简单高效,网络应用程序只需要调用相应的接口就可以很方便地访问Hessian 所提供的Web 服务。其处理过程可以描述为:客户端通过Hessian 本身提供的接口来发起请求,按照Binary-RPC 协议将请求信息进行填充,填充完毕后根据自定义的序列化规则对请求信息进行序列化,将二进制格式文件转化为流,通过Http 协议进行传输;服务器端在接收到流后将其返序列化出客户端调用的方法和参数,对服务端服务进行调用,然后把处理结果返回至客户端。Hessian 协议框架的完整调用过程如图1所示。

图1 Hessian协议框架

2.2 大容量文件传输技术

在Web 应用中,大文件上传是一个比较重要的交互场景,如上传较大的Word文档、Excel表格数据、音视频文件等。传统的大文件上传方式主要通过Flash 或ActiveX 来实现,常常因为文件容量过大或者网络异常导致上传时间较长或上传失败。随着HTML 技术的发展,万维网联盟(W3C)在2014 年10 月推出HTML 最新标准,即HTML5。HTML5 规范提供了文件上传、下载、读取内容等接口对象,如FileList、File、Blob、FileReader、URL。在JavaScript 中,File对象是Blob 对象的子类,Blob 对象包含slice 方法,通过这个方法,就可以对二进制文件进行分割切片。

本文采用HTML5 规范,在客户端使用slice方法将文件进行分割切片传输,服务端自动组装合成原始文件,进而实现大容量文件传输功能,同时能有效提高文件上传的效率。处理过程简单描述为:在客户端获取文件的二进制内容,然后对其内容进行拆分,并将每个切片上传到服务端,最终服务器将文件切片进行合并组装成原始文件。在文件开始上传之前,客户端和服务器端需要有一次信息交互过程,主要包括文件相关信息以及约定切片的大小,当客户端和服务器端达成共识之后就可以开始文件传输。

3 系统主要功能设计及实现

构建基于Hessian 协议框架的文件传输系统,需要对服务器端和客户端分别进行开发。服务器端主要实现可供客户端调用的接口开发、对应服务处理函数的具体实现,以及配置Servlet 发布Web 应用程序。客户端主要创建与服务器的连接,访问服务器端提供的接口实现文件传输及加工处理等功能。

3.1 服务器端主要功能及实现

服务器端主要实现将接收到的二进制流反序列化为对服务的请求,调用相应函数处理后,将处理结果序列化为二进制流返回给客户端,不需要开发用户界面。

3.1.1 创建Web项目

创建名为FileServer 的Web 项目作为文件传输的服务器端,从Hessian 官网下载最新的hessian.jar文件,存放在WEB-INF/lib 文件夹中,完成服务器端Hessian协议的安装。

3.1.2 设计文件传输服务接口

创建文件上传服务接口,命名为IFileService,实现向外界暴露服务业务,用于给客户端调用。接口中声明的方法包含了文件的常见操作,比如上传、下载、重命名、复制、删除、文件合并、添加水印等。接口代码如下:

package fileserver.service;

import java.io.InputStream;

import java.util.Map;

public interface IFileService{

public boolean upload(String filePath,boolean isAppend,InputStream

fileContentStream);

public byte[]download(String filePath,int block-Num);

public boolean rename(String filePath,String old-FileName,String newFileName);

public boolean copyFile(String srcFilePath,String desFilePath);

public boolean delete(String filePath);

public boolean wdMergeAsDoc(String[]wdFilePaths,String pdfFilePath);

public boolean wdAddPicWaterMark(String img-Path,String destFilePath);

3.1.3 实现服务接口声明的方法

具体实现服务接口中声明的方法,完成上传、下载及文件加工处理功能模块的开发。以文件上传功能为例,关键代码介绍如下:

package fileserver.service.impl;

import fileserver.service.IFileService;

public class FileServiceImpl implements IFileService{

public boolean upload(String filePath,boolean isAppend,InputStream

fileContentStream){

BufferedInputStream bis=null;

BufferedOutputStream bos=null;

boolean bSuccess=false;

try{

bis = new BufferedInputStream(fileContent-Stream);

String fileFullPath = getFileFullPath(sysId,filePath);

String dirPath =fileFullPath.substring(0,file-FullPath.lastIndexO(fFile.separator));

File dirs=new File(dirPath);

i(f!dirs.exists()){

dirs.mkdirs();

bos=new BufferedOutputStream(new FileOutput-Stream(fileFullPath,isAppend));

byte[]buffer=new byte[1024];

int r=bis.read(buffer,0,buffer.length);

while(r >0){

bos.write(buffer,0,r);

r=bis.read(buffer,0,buffer.length);

3.1.4 部署服务器端的服务

基于Hessian 协议的Web 服务以Servlet 方式发布,因此需要在web.xml 文件中配置相应的HessianServlet,同时还需要配置提供给客户端调用的接口以及URL 映射。本文将服务端应用程序部署至Tomcat,启动服务,完成服务器端的开发和部署。

3.2 客户端主要功能及实现

客户端主要将远程接口调用序列化为流,并传输到服务端。为了实现Hessian 服务的远程调用,客户端需要定义与服务器端一样的接口类和实体类,使用Hessian 包的代理工厂类HessianProxyFactory的create方法来实现调用。

3.2.1 创建文件上传客户端

文件上传客户端界面包括操作按钮和显示界面。操作按钮有“上传”和“删除”两个按钮,用于选择需要上传的文件或删除已上传的文件。显示界面用于显示选择的文件名称、文件大小、上传进度等信息,如图2所示。

图2 文件上传客户端

3.2.2 调用远程服务上传文件

客户端添加对Hessian.jar文件的引用,同时将服务器端的FileServer 接口打包成jar文件提供给客户端调用。创建HessianProxyFactory 实例,用于获得Hessian 服务的远程调用,选择需要上传的文件,上传至文件服务器,关键代码如下所示:

public class FileClientHandler{

private IFileService fileService;

public FileClientHandler(){

ini(t);

public void ini(t){

HessianProxyFactory factory = new HessianProxy-Factory();

try{

String[]str=getServerPro();

fileService =(IFileService)factory.create(IFileService.class,systemId=st[r1];

}catch(MalformedURLException e){

e.printStackTrace();

4 结语

本文设计并实现了与具体网络应用相互独立的文件传输服务系统,供不同的应用程序进行调用,节约了外部网络应用的开发成本。系统基于Hessian 协议框架和HTML5 标准开发,突破了文件上传的各种限制,能有效减少传输开销、提升文件传输效率,保证文件传输的稳定性和可靠性。后续的研究工作中,还可以继续优化和创新文件传输的逻辑,以提供更高效和可靠的文件传输服务。

猜你喜欢
服务器端序列化二进制
有用的二进制
用Scratch把十进制转为二进制
有趣的进度
基于Qt的安全即时通讯软件服务器端设计
初中生写作序列化实践与思考
基于Qt的网络聊天软件服务器端设计
分层次序列化训练增强考场写作的增分因素
对“失序”的习作教学之思考和把脉
坚持以读促写 注重思维训练
一种基于Java的IM即时通讯软件的设计与实现