加油站资金库存管理辅助系统设计与实现

2016-01-05 12:43谌连龙何先波李小松
电脑知识与技术 2015年29期

谌连龙++何先波++李小松

摘要:利用java实现文档在网络中从客户端到服务器端的传输。客户端可以将指定类型的文件及上传时间,实现特定文件定时自动上传的功能。该设计与实现建立在中石油加管系统之上,实现加管系统当日数据的快速获取与备份,并且该辅助系统已在定点试用中。

关键词:socket;自启服务;定时上传

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)29-0051-03

Gas Station Capital Inventory Management Auxiliary System Design and Implementation

CHEN Lian-long, HE Xian-bo, LI Xiao-song

(Computer School of China West Normal University, Nanchong 637000, China)

Abstract:This article focuses on the use of Java implementation document from the client to the server in the network transmission. The client can specify the type of the file and upload time, realize the function of specific files regularly upload automatically。The design and implementation based on oil and pipe system,implementation with quick access to the data pipe system and backup, and the auxiliary system has been already used in somewhere.

Key words: socket; automatic startup service; time to upload

随着计算机应用的不断发展,客户对于应用程序能否满足其功能需求更加的看重。中国石油公司拉萨地区分管负责人不满足于加油站管理系统原有功能,意在其基础上增加一种较实时的数据监测功能,从而更好了解各加油站点燃料及其他产品的每日销售状况,且通过对数据分析得到结果,与加管系统中数据进行对比,比较实际销售金额与应产生的销售金额,避免因某些因素造成的资金缺失,起到一种监督的作用。

为了满足客户这一功能需求,提出了基于B/S模式的加油站资金库存管理辅助系统的设计与实现。该辅助系统由两部分组成:供浏览器访问的服务器平台与放置在各个站点获取原始数据的客户端。

本文主要介绍获取原始数据的客户端、服务器端设计与实现,采用java编程语言,使用socket进行数据通讯,socket提供了基于TCP/IP网络协议的接口,采用客户机和服务器通信机制,可靠且速度快。

1 系统功能简介

该系统由几个部分组成:放置在各个站点的加管系统和站点自启服务程序、放置在服务器端的自启服务程序、数据库、j2ee平台网站式管理平台。当加管系统生成当天的销售情况、燃料罐数据等文档时,在客户端的自启服务就会将这些文档上传到服务器端,服务器端的自启程序就会在接收到这些文档的同时,解析数据并保存到服务器数据库中。站点人员通过浏览器即可在班结时通过手动输入金额与服务器端数据进行比较,避免站点应收金额与实际金额不匹配的情况出现。系统结构如图1所示。

2 socket简述

Socket,又被称为套接字,是由IP地址和端口号组合而成。用于实现网络上客户端和服务器之间的连接和数据通信。其通讯过程大致是:服务器端首先启动成功,并且处于接收状态监听中,客户端写好socket,包含IP和端口号,然后向服务器端发送请求,服务器接收并处理请求后,将结果socket返回给客户端。套接字通讯一般用于网络底层,无论是基于TCP/IP的可靠传输,还是基于UDP的不可靠传输,都可以使用Socket套接字来实现通信。Socket通信过程如图2所示。

3 客户端的实现

客户端主要是用来完文件的自动上传,附带了其他参数设置,包括指定文件上传时间、文件所在目录、服务器端端口和IP等。在各站点主机上只需要进行一次参数配置,之后便可以使用客户端自启程序,完成定时自动上传指定文件。整个客户端运行过程如图3。

图3 客户端运行过程图

3.1 参数设置

实现参数设置功能的是2个桌面程序,运行这2个程序时的界面如图4。在界面上可以看到“基本参数”、“服务器参数”、“站点参数”等项。文件类型指的是需要上传的文件名前缀;文件目录即需要上传文件的存放目录,在这里指定目录,方面程序自动上传时直接到该目录进行查找;上传时间即为给定一个时间,定时执行任务;端口号是指服务器端允许客户端访问的一个端口号,与服务器端端口号对应即可;ip地址就是服务器端所使用的公网IP地址;站点名指的是当前站点的名称;站点编号项指的是管理中心对其进行的编号。

通过界面上的操作,将填好的数据保存到pc机的注册表中,关键代码如下:

Preferences pre=Preferences.systemRoot().node("/baseinfo");

以上代码会在注册表的HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs中生成一个名为baseinfo的表,保存的是一个键值对数据。

将数据写入注册表的代码:

pre.put("关键字", 值);

从注册表读数据代码:

pre.get("关键字", "缺省值");

3.2 实现客户端程序开机启动

要实现开机自动启动程序,需要借助一个工具:JavaService-2.0.10。该工具作为将java程序注册成为windos系统自启服务的一种,使用起来非常方便,只需要将java程序打包成xxx.jar格式的包,然后放在JavaService-2.0.10的classes目录下,然后运行如下在dos界面下输入如下代码:

JavaService-2.0.10\JavaService.exe-installrunclient%cd%/Java/jdk1.6.0_16/jre/bin/server/jvm.dll-Djava.class.path=%cd%/Java/jdk1.6.0_16/lib/tools.jar;%cd%/JavaService-2.0.10/classes/dom4j-1.6.1.jar;%cd%/JavaService-2.0.10/classes/client.jar -start main.Main -out "%cd%/out.log" -err "%cd%/err.log"

然后界面就会显示服务装配成功,接着在输入net start runclient,当服务启动成功时,说明该服务部署成为系统自启服务。

3.3 文件自动上传实现

文件自动上传的实现,用到了java自带的timer类,并且是两个定时器进行嵌套,彼此共享一个信号变量。首先是在指定时间,触发定时器,执行文件查找任务,然而此时不一定会有需要上传的文件存在,所有,在同时还会启动另一个定时器,该定时器的目的就是在一个周期较短的时间内做文件查找操作,直到找到可以上传的文件,才结束文件查找操作,并且改变信号变量的值,使得外部定时器任务得以执行,完成文件上传。关键代码如下:

if (commontUtil.getDir() != null&& commontUtil.getSiteSetName() != null) {

fileName = commontUtil.getDir()+"\\"+commontUtil.getSiteSetName() + ".xml";

// 检查配置文件是否存在

file = new File(fileName);

if (!file.exists()) {

MainGui gui = new MainGui();

gui.initview();

} else {

try {

String[] prefix = commontUtil.getprefix();

for (int i = 0; i < prefix.length; i++) {

String filePath = SearchFile.getFilePath(prefix[i]);

if (filePath != null) {

File fi_ = new File(filePath);

if (fi_.exists()) {

MyTask.flag = true;

// 文件存在,就立马上传

new FtpClient2().startUpload(prefix[i],commontUtil.getPort(), commontUtil.getIP());}}

else {

}}} catch (ParseException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {e.printStackTrace();

} finally {

try {

if (MyTask.flag) {

new FtpClient2().startUpload_siteset(commontUtil.getPort(), commontUtil.getIP());

this.cancel();

MyTask.flag = false;

}} catch (ParseException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}}}}

4 服务器端实现

服务器端包括接收文档的自启程序和数据库、供网页访问的网站式平台。在这里主要介绍接收文档的自启程序的实现。该程序主要目的就是将站点客户端上传的文档存放到指定目录文件夹中,当在网页中触发访问事件后,解析文档,将文档中的数据保存到数据库中,并且显示到页面上。

接收文件的关键代码如下:

dout = new DataOutputStream(socket.getOutputStream());

din = new DataInputStream(socket.getInputStream());

dout.writeUTF("服务器地址:" + socket.getLocalAddress());

// 访问Socket 对象的getInputStream 方法取得客户端发送过来的数据流

din.readUTF();

// 获取文件名

String fileName = din.readUTF();

if (filePath.endsWith("/") == false&& filePath.endsWith("\\") == false) {

filePath += "\\";

}

filePath += fileName;

if (filePath != null) {din.readLong();

// 从客户端上传到服务器

// 开始接收文件

writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(filePath))));

dout = new DataOutputStream(socket.getOutputStream());

int bufferSize = 10240;// 10k

byte[] buf = new byte[bufferSize];

int read = 0;

while ((read = din.read(buf)) != -1) {

writer.write(buf, 0, read);}

writer.flush();

5 结束语

本文主要介绍了运用java自带的socket编程实现网络中文件传输,并且用到java.util.Timer和java.util.TimerTask实现周期性的定时上传功能。该辅助系统实现了当加管系统生成指定文档后及时将文档传到服务器端的功能,通过网页访问上传到服务器端的数据。该系统作为一个辅助功能存在,已在中国石油天然气集团公司西藏拉萨地区试用中,具有一定的使用价值。

参考文献:

[1] 李刚. 疯狂java 讲义[M]. 2版.北京: 电子工业出版社, 2012.

[2] java socket编程[EB/OL]. http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html.

[3] 习燕菲. 基于Socket的网络文件传输[J]. 信息与电脑:理论版, 2015(8): 52-54.