电费代缴系统Word文档下载推荐.docx
《电费代缴系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电费代缴系统Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。
设计中遇到的问题及解决方法:
-9-
八:
源程序清单-9-
8.1数据库文件-9-
8.2客户端程序-10-
8.3中间件程序-16-
8.4服务器-22-
8.5服务器-27-
九:
心得体会-32-
十:
参考文献-33-
前言
近年来,随着高科技技术的告诉发展,传统的手工操作系统为主的电费缴纳的管理方式,因其信息反应慢,工作效率低,管理质量差,备受广大服务者争议。
在计算机信息技术飞速发展与广泛应用的今天,这种落后的管理方式与时代的步伐已显得格格不入,对电费缴纳系统实现智能化,信息管理化,是信息时代对现代社会电费管理工作提出的严峻要求。
为了更好的提供电费代缴服务,为了使电费管理更加科学,更严谨,同时更具有操作性,节省操作人员的劳动,电费缴纳系统必须与先进技术相结合,应用先进的网络管理技术来操作电费管理系统,从而使其为人们提供更方便,更快捷的电费管理服务。
系统环境
在Linux环境下,使用GNUC或GNUC++,在UNIX/Linuxmake开发工具的的管理和控制下,利用UNIX/LinuxSocket库在网络的底层进行开发设计。
电费缴费系统是基于UNIXSocket和MySQL数据库设计一个交易型中间件系统。
在Linux环境下使用GNU C或者GNUC++,在Linuxmake开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。
此模拟电费交费系统采用“客户端—中间件—服务器”模式,其中主要包括三大部分:
客户端(Client),中间件(Middleware)和服务器端(Server)。
客户端(Client)主要实现用户管理、查询、交易(交费,购物等),撤销和统计等功能;
中间件(Middleware)要完成与客户要求相符的功能——是本地的本地处理,否则发往服务器端——接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;
服务器端(Server)主要实现客户端或中间件提出的业务请求并做好留迹工作
设计目的
对电费查询与缴费业务进行了系统全面的分析研究。
针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。
采用开发工具Linux+Mysql进行系统设计。
设计系统能够提供对点费信息输入、查询、编辑、打印以及话费统计各明细项目的数据编辑,自动计算出电费的各项合计数据;
可自主设定条件从而达到数据的多角度查询功能;
方便导入、导出数据及输出报表。
总体设计
1.客户端页面
2.客户端,中间件和服务器联系
详细设计
(1)基本功能
1.1查询费用
客户到柜台缴纳费用,客户首先用账号及密码登陆系统,然后登陆电表序列号和银行账号,中间件根据用户提供的电表序列号码把“查询费用”指令存入数据库。
中间件检测到查询费用指令,把查询费用指令组成数据包发送到服务器中。
服务器把查询费用的结果返回中间件,确认信息后,从接收表中检测返回结果中间件,并监控因错误操作并返回结果。
服务器从接收表中查询到“查询费用”指令,把查询费用指令填入数据库.得到查询费用指令后从主数据库查询用户的费用信息。
服务器如果因错误没有得到查询结果,把返回结果系统错误,并显示出来。
1.2缴纳费用
客户端发出“缴纳费用”指令存入中间件。
中间件检测到“缴纳费用”指令,把“缴纳费用”指令组成数据包放入缓冲区,然后发送给服务器。
服务器把“缴纳费用”的指令填入接收,并返回确认信息。
中间件在得到确认信息后,从接收表中检测返回结果给客户端,并监控错误无返回结果的情况。
服务器从接收表中查询到“缴纳费用”指令,把“缴纳费用”指令填入数据库。
得到“缴纳费用”后从主数据库进行处理,并把银行数据库中所缴的费用扣除,结果填入数据库。
“服务器处理系统”如果因为错误没有得到结果,把返回结果“系统错误”填入发送错误信息给中间件,然后中间件把信息返回给用户。
1.3查询信息
通过用户名和电表序列号进行查询,录入正确则返回用户信息,反之,退出系统。
1.4退出系统
客户端发送退出系统请求,经中间件确认。
然后客户端退出系统并关闭连接。
(2)服务器的开发
2.1服务端的开发
服务器主要包含守候进程(daemon),也叫精灵进程,或服务器进程,是生存期长的一种进程。
它们常常在系统引导装入时起动,在系统关闭时终止。
因为它们没有控制终端,所以说它们是在后台运行的。
它等待客户机与其联系,提出某种类型的服务要求。
服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)。
2.2客户端的开发
打开一通信通道,并连接到服务器所在主机的特定端口。
向服务器发服务请求,等待并接收应答;
请求结束后关闭通信通道。
客户是交易的发起者。
实现功能与服务器方同。
2.3套接字
1.流式套接字(SOCK-STREAM):
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。
内设流量控制,避免数据流超限;
数据被看作是字节流,无长度限制。
文件传送协议(FTP)即使用流式套接字。
数据报式套接字(SOCK-DGRAM):
提供了一个无连接服务。
数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
原始式套接字(SOCK-RAW):
该接口允许对较低层协议,如IP、ICMP直接访问。
常用于检验新的协议实现或访问现有服务中配置的新设备。
基本套接字系统调用
创建套接字—socket()
地址绑定—bind()
建立连接—connect()与accept()
监听连接—listen()
数据传输—send()/write()与recv()/read()
关闭套接字—close()
2.错误处理
利用函数的返回值来判断函数执行是否正确。
使用mysql提供的错误号和错误信息:
–错误号:
unsignedintmysql_errno(MYSQL*mysql)
–错误信息:
char*mysql_error(MYSQL*mysql)
调试与测试
一.生成数据库(source*.sh)
二.程序的编译和运行
编译:
cc–oclientclient.c-L/usr/lib/mysql–lmysqlclient;
cc–omiddlemiddle.c-L/usr/lib/mysql–lmysqlclient;
cc–obankbank.c-L/usr/lib/mysql–lmysqlclient;
cc–ometermeter.c-L/usr/lib/mysql–lmysqlclient;
运行:
./middlemiddle;
./meterMeter;
./bankBank;
./clientmiddlemyhttp;
三.多任务模式与启动相关服务
四.相关操作
现金交易:
网上交易:
查询:
五.返回结果信息
(1)对Mysql数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去。
(2)对套接字这样的概念不是很清楚,在老师的辅导和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来。
(3)以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计。
(4)还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。
(5)在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。
源程序清单
8.1数据库文件
BANK.SH
dropdatabaseifexistsbank;
createdatabasebank;
usebank;
createtableinformation
(numberchar(19)notnull,passwdchar(10),namechar(20),moneyfloat(10,10));
insertintoinformation(number,passwd,name,money)values("
061407344"
"
123456"
zpf"
1000);
061407342"
zxl"
061407340"
yxl"
Meter.SH
dropdatabaseifexistsmeter;
createdatabasemeter;
usemeter;
createtablemeter(numberchar(11),namechar(30),moneyfloat(10,10));
insertintometer(number,name,money)values("
001"
50);
002"
22);
003"
20);
MIDDLE.SH
dropdatabaseifexistsmiddle;
createdatabasemiddle;
usemiddle;
createtableinformation(serviceint,portchar(20),ipchar(20));
insertintoinformation(service,port,ip)values(1,"
Meter"
myhttp"
);
insertintoinformation(service,port,ip)values(2,"
Bank"
USERS.SH
dropdatabaseifexistsusers;
createdatabaseusers;
useusers;
createtableusers(namechar(20),passwdchar(10));
insertintousers(name,passwd)values("
hello"
world"
8.2客户端程序
Client.C
#include<
stdio.h>
sys/types.h>
sys/socket.h>
netinet/in.h>
sys/un.h>
netdb.h>
unistd.h>
mysql/mysql.h>
fcntl.h>
termios.h>
errno.h>
#defineECHOFLAGS(ECHO|ECHOE|ECHOK|ECHONL)
intset_disp_mode(intoption);
intgetpasswd(char*passwd,intsize);
intmain(intargc,char*argv[])
{
charname[10],passwd[10],choose;
charsend_buf[1024]="
"
;
chartmp[1024],meter[30],number[30],pswd[10],money[30],myl_buf[1024],fd_buf[1024];
charlog[]="
clt.log"
intconnect_fd;
intret;
inti;
intport;
intlen;
intfd;
MYSQLmysql;
MYSQL_ROWrow;
MYSQL_RES*result;
structservent*sp;
structhostent*hp;
staticstructsockaddr_insrv_addr;
if(mysql_init(&
mysql)==NULL){
fprintf(stderr,"
Errorinmysql_init!
\n"
exit(-1);
}
if(!
mysql_real_connect(&
mysql,"
localhost"
root"
0,"
users"
0,NULL,0)){
Errorinconnection:
%s[%d]\n"
mysql_error(&
mysql),mysql_errno(&
mysql));
mysql_close(&
mysql);
exit(-2);
system("
clear"
if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){
Logfile%sopenerror!
\a\n"
log);
clear:
printf("
Entertheusername:
scanf("
%s"
name);
getchar();
set_disp_mode(0);
getpasswd(passwd,sizeof(passwd));
set_disp_mode
(1);
sprintf(myl_buf,"
select*fromuserswherename=\"
%s\"
if(mysql_query(&
mysql,myl_buf)!
=0){
Errorinquery:
exit(-3);
if((result=mysql_store_result(&
mysql))==NULL){
Errorinstore_result:
mysql_free_result(result);
mysql_close(&
exit(-4);
};
if((mysql_num_rows(result))==0){
printf("
usedontexist!
gotoclear;
row=mysql_fetch_row(result);
if(strcmp(row[1],passwd)!
Thepasswdisnotture\n"
}
if((sp=getservbyname(argv[1],"
tcp"
))==NULL){
Error:
getservbyname"
if((hp=gethostbyname(argv[2]))==0){
gethostbyname"
exit(-2);
memset(&
srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
bcopy(hp->
h_addr,&
srv_addr.sin_addr,hp->
h_length);
srv_addr.sin_port=sp->
s_port;
clen:
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<
0){
perror("
cannotcreatecommunicationsocket"
return1;
ret=connect(connect_fd,(structsockaddr*)&
srv_addr,sizeof(srv_addr));
if(ret==-1){
cannotconnecttotheserver"
close(connect_fd);
%sloginsucessfully\n"
1.cash2.online\n"
3.search4.exit\n"
Pleasechooseyouroption:
%c"
&
choose);
switch(choose){
case'
1'
:
printf("
Pleaseinputyourmeternumber:
"
scanf("
meter);
Pleaseinputthemoneyyouwanttosubmit:
scanf("
money);
getchar();
strcat(send_buf,"
3|"
strcat(send_buf,meter);
strcat(send_buf,"
|"
strcat(send_buf,money);
|1|"
%s\n"
send_buf);
break;
2'
Pleaseinputyourbanknumber:
number);
set_disp_mode(0);
getpasswd(pswd,sizeof(pswd));
set_disp_mode
(1);
1|"
strcat(send_buf,number);
strcat(send_buf,pswd);
strcat(send_buf,meter);
2|"
break;
3'
PleaseEnteryourmeternumber:
4|"
4'
strcpy(send_buf,"
default:
;
write(connect_fd,send_buf,strlen(send_buf)+1);
len=read(connect_fd,send_buf,1024);
if(len>
0)
Messagefrommiddle:
%s\n"
close(connect_fd);
switch(send_buf[0]){
0'
sprintf(fd_buf,"
%-10s%-20s%-20s[0k]\n"
name,meter,money);
write(fd,fd_buf,strlen(fd_buf));
printf("
OPTIONSUCCESSFULLY\n"
PleaseEnteranykeytoreturn...\n"
getchar();
strcpy(send_buf,"
gotoclen;
break;