基于linux的手机缴费系统.doc_第1页
基于linux的手机缴费系统.doc_第2页
基于linux的手机缴费系统.doc_第3页
基于linux的手机缴费系统.doc_第4页
基于linux的手机缴费系统.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言 移动通信业务中,有一部分都是和手机缴费的业务相关,而手机缴费业务目前处于发展的阶段,手机缴费业务作为目前唯一的数据业务正在飞速发展中近年来,随着中国市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可以总结为以下几点: 这追求效率的时代,随着们生活水平的提高,消费项目,服务种类的增加,社会需要方便和快捷的缴费方式。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能。 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。 手机缴费系统是基于UNIX Socket和MySQL数据库设计一个交易型中间件系统。在Linux环境下使用GNUC或者GNU C+,在Linux make开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。此模拟手机交费系统采用“客户端中间件服务器”模式,其中主要包括三大部分: 客户端(Client),中间件(Middleware)和服务器端(Server)。客户端(Client)主要实现用户管理、查询、交易(交费,购物等),撤销和统计等功能;中间件(Middleware)要完成与客户要求相符的功能是本地的本地处理,否则发往服务器端接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;服务器端(Server)主要实现客户端或中间件提出的业务请求并做好留迹工作。 本设计主要是利用UNIX系统提供的Socket库在网络底层,C语言,MySQL数据库,以及软件工程的思想方法和TCP/IP设计出的一个模拟手机交费中间件系统。本设计包括了模拟手机交费系统的开发环境,设计目的,总体设计,详细设计,具体实现代码,以及设计中遇到的问题及解决方法。将服务器端(Server),中间件(Middleware)和客户端(Client)进行连接后可模拟出现实中手机交费的的功能。它可以实现手机费用查询,话费充值,打印花费清单详目等基本功能。 目录一、系统环境(硬件环境、软件环境)3二、计目的3三、体设计(程序设计组成框图、流程图、类图)4程序设计组成框图:4:中间件模型5流程图5四、详细设计7设计方法7功能模块说明7五、调试与测试9调试方法9结果及简单分析10六、设计中遇到的问题及解决方法10七、源程序清单11八、总结,收获与体会36九、参考文献37一、系统环境(硬件环境、软件环境)硬件环境:intel p4 3.06GHz 80G硬盘软件环境:基于windows xp虚拟机下的Red Linux操作系统二、计目的本次设计的主要课题是:模拟手机缴费系统,通过对移动通信话费查询与缴费业务进行了系统全面的分析研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发工具Linux+My进行系统设计。基于Uinx Socket和My数据库,设计一个交易型中间件系统。提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型软件。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间。这里主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件中间件,尤其掌握这种设计的思想和方法。本设计系统能够通过两种方式提供对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑,自动计算出花费的各项合计数据;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报表。三、体设计(程序设计组成框图、流程图、类图)程序设计组成框图: 实现工具及方法基本功能Linux +Mysql+ VMware Workstation客户端中间件1.手机余额查询客户端发送:头部(A)+ 目标(移动公司P)+手机号码(15) +机主姓名(30) 中间件发送:头部(B)+ 目标(移动公司P)+标志(O)+ 手机号码(15)+ 机主(30) +余额(20)或:头部(B)目标(移动公司P)+标志(E)+出错原因2.银行账户余额查询:客户端发送:头部(A)+目标(银行B)+银行账户(19)+密码(10)中间件发送:头部(B)+目标(银行B)+标志(O)+户主(30)+账号(19)+余额(20)或:头部(B)+目标(银行B)+标志(E)+错误信息3.手机充值客户端发送:头部(C)+手机号码(15)+银行账户(19)+银行密码(10)+充值金额(20)中间件发送:头部(D)+标志(O)或:头部(D)+标志(E)+错误原因中间件服务器中间件银行服务器1.查询余额中间件发送:头部(E)+银行账户(19)+密码(10)服务器发送:头部(F)+标志(O)+银行账号(19)+用户名(30)+余额(20)或:头部(F)+标志(E)+出错原因2.扣款中间件发送:头部(G)+银行账户(19)+密码(10)+扣款金额(20)服务器发送:头部(H)+标志(O)或:头部(H)+标志(E)+出错原因中间件移动服务器1.查询余额中间件发送:头部(E)+手机号码(15)服务器发送:头部(F)+标志(O)+手机号码(15)+机主姓名(30)+余额(20)或:头部(F)+标志(E)+出错原因2.缴费中间件发送:头部(G)+手机号码(15)+缴费金额(20)服务器发送:头部(H)+标志(O)或:头部(H)+标志(O)+出错原因退出系统当完成一次交易时,就可以退出系统。:中间件模型流程图Socker()建立服务方套接字,描述符为sbingd()绑定套接字与本地地址和端口Linsten()通知TCP,准备接受Socker()建立服务方套接字,描述符为saccept()等待客户方连接Connect()建立与服务方链接recv()/read()读取客户方数据Send()/write()向服务器方发送请求成功后返回与s具相同特性的新套接字服务处理及数据加等待服务器方send()/write向客户方提供服务结果recv()/read读取服务方数据Close()关闭新套接字s,结束本次对话Close()关闭最初套接字s,结束服务器Close()关闭最初套接字s,结束本次对话四、详细设计设计方法在Linux环境下,使用GNU C或GNU C+,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。功能模块说明本系统主要是由一个客户机,一个中间件以及两个服务器组成,两个服务器分别负责手机直接缴费和网上银行缴费。以下即是每个模块间的联系图:LogClient 2Client 1 请求1 请求2 返回 返回 Log中 间 件(Middleware)请求服务 响应服务Log Middleware服务器端(Server)请求数据 返回结果 Log MiddlewareMysql database(1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择。此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。(2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息转发给哪个服务器。通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来。简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。(3)服务器:本系统有两个服务器,手机服务器(S2)和银行服务器(S1)1)手机服务器在这一部分,需要实现的功能是直接缴费。它的过程是接收从中间件过来的信息,在手机服务器的客户账户上相应加上对应的话费,即更新手机服务器数据库。更新成功直接之后,将缴费成功的信息传回中间件。具体流程如下:查询用户信息缴费金额中间件处理 更新银行数据库现金缴纳话费工作流程图Service2(手机服务器)middleclient 注:直接现金缴纳,不需要通过银行服务器。从客户端开始流程,最后更新手机服务器数据库,即缴费成功。2)银行服务器在银行服务器这一块,需要实现的功能是手机网上缴费。它的过程是接收从中间件过来的信息,在客户所输入的银行账户上扣除相应的手机费用;如果在手机的服务器那一块出现问题,缴费不成功,银行服务器还负责把之前所扣除的话费给加上,具体实现流程如下:更新银行数据库手机缴费失败返回扣除费用手机缴费成功从银行卡扣钱switch(v00)查询用户信息选择银行服务器后整个系统的工作流程图:Service2(手机服务器)clientmiddleService2(银行服务器) 54716 23虚线表示在手机服务器出错,缴费失败,向银行服务器返回所交的话费。五、调试与测试调试方法(1)把数据库文件导入数据库#mysql u root c1.sh#mysql u root middl.sh#mysql u root s1.sh#mysql u root s2.sh(2)启动Mysql 数据(以bank为例) #show database;#use bank;#show tables;#select * from information;(3)对程序进行编译连接#gcc o c1 c1.c L/usr/lib/mysql -lmysqlclient#gcc o m1 m1.c L/usr/lib/mysql -lmysqlclient#gcc o s1 s1.c L/usr/lib/mysql -lmysqlclient#gcc o s2 s2.c L/usr/lib/mysql -lmysqlclient (5) 运行程序#./m1 x切换到终端2#./s1 world切换到终端3#./s2 zhongjr切换到终端4#./m1 x myhttp结果及简单分析1:缴费银行缴费,银行服务器与手机服务器都对信息有相应的操作,缴费得到确认成功后,银行卡上减去100元,手机话费加上100元2:查询六、设计中遇到的问题及解决方法我们遇到的第一个问题就是:传送的消息有许多乱码,后来分析得出是字符串数组没有清零,调用bzero(),清空后问题解决。在取系统日期时,我们的函数看着也没什么问题,但总提示有错误,最后发现原来忘记了头文件include,加上后就正确了。还有一个最可恶的问题,老是莫名奇妙的出现”段错误”,开始时摸不着头脑,就和同学一块商量,凭着各自了了的一点经验讨论,还好最后都解决了,主要时字符串末尾一定要加0,表示结束,否则可能是越界。主要问题:(1) 对Mysql 数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了Linux+php+Mysql基础与提高这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去。(2) 对套接字这样的概念不是很清楚,在老师的辅导和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来。(3) 以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计。(4) 还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。(5) 在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识。七、源程序清单中间件代码:#include #include #include #include #include #include #include #include #include #include #include int main(int argc,char *argv) int log(char *filepath,char *buff ); char log_file10=mid.log; char log_buf1024; /网络通信信息 int listen_fd;/监听套接字描述符 int com_fd;/通信套接字描述符 int len;/请求方地址长度 int ret; pid_t pid;/处理请求进程id struct servent *sp;/存放服务器端口信息,从services文件读取 struct sockaddr_in srv_addr;/服务器地址 struct sockaddr_in clt_addr;/客户端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);/创建监听套接字 /数据库连接信息 MYSQL mysql;/MySQL连接 MYSQL_ROW row;/结果的行 MYSQL_RES *result;/查询结果 char myl_buf1024;/存放sql语句 /初始化网络连接参数 int DataSend(char *service,char *dest,char sed_buf1024,char rcv_buf1024); if(listen_fds_port; /绑定服务套接字 ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr); if(ret=-1) perror(绑定服务套接字失败); strcpy(log_buf,绑定服务套接字失败); log(log_file,log_buf); close(listen_fd); return 1; /监听客户连接 ret=listen(listen_fd,1024); if(ret=-1) perror(监听客户请求失败); strcpy(log_buf,监听客户请求失败); log(log_file,log_buf); close(listen_fd); return 1; /连接users数据库 if(mysql_init(&mysql)=NULL) fprintf(stderr,数据连接初始失败); strcpy(log_buf,数据连接初始失败); log(log_file,log_buf); exit(-1); if(!mysql_real_connect(&mysql,localhost,root,0,users,0,NULL,0) fprintf(stderr,数据库连接错误: %s %dn,mysql_error(&mysql),mysql_errno(&mysql); mysql_close(&mysql); exit(-2); /开始接受客户请求 printf(等待客户连接n); while(1) len=sizeof(clt_addr); com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); if(com_fd0) if(send_buf0=C) printf(收到充值请求,信息如下n); printf(%sn,send_buf); printf(手机号码:%sn,send_buf+2); printf(银行账号:%sn,send_buf+17); printf(银行密码:%sn,send_buf+36); printf(充值金额:%sn,send_buf+46); char p_send1024; char p_rcv1024; char b_send1024; char b_rcv1024; /缴费封包 memcpy(p_send,G,2); memcpy(p_send+2,send_buf+2,15); memcpy(p_send+17,send_buf+46,20); /扣款封包 memcpy(b_send,G,2); memcpy(b_send+2,send_buf+17,19); memcpy(b_send+21,send_buf+36,10); memcpy(b_send+31,send_buf+46,20); DataSend(argv2,argv3,b_send,b_rcv); printf(银行数据已发送n); char t1024; memcpy(t,D,2); if(b_rcv2=O) DataSend(argv4,argv5,p_send,p_rcv); printf(移动公司数据已发送n); if(p_rcv2=O) printf(充值成功n); memcpy(t+2,O,2); write(com_fd,t,1024); else if(p_rcv2=E) memcpy(t+2,E,2); memcpy(t+4,p_rcv+4,50); write(com_fd,t,1024); else if(b_rcv2=E) memcpy(t+2,E,2); memcpy(t+4,b_rcv+4,50); if(send_buf0=A) printf(收到查询请求:n); if(send_buf2=B) printf(收到银行查询,信息如下n); printf(%sn,send_buf); printf(%sn,send_buf+2); printf(银行账号:%sn,send_buf+4); printf(银行密码:%sn,send_buf+23); char tmp1024; char tmp_r1024; memcpy(tmp,E,2); memcpy(tmp+2,send_buf+4,19); memcpy(tmp+21,send_buf+23,10); printf(银行账号:%sn,tmp+2); printf(银行密码:%sn,tmp+21); DataSend(argv2,argv3,tmp,tmp_r); printf(%sn,tmp_r); printf(%sn,tmp_r+2); printf(%sn,tmp_r+4); printf(%sn,tmp_r+6); printf(%sn,tmp_r+36); printf(%sn,tmp_r+55); write(com_fd,tmp_r,1024); else if(send_buf2=P) printf(收到手机查询,信息如下n); printf(%sn,send_buf); printf(%sn,send_buf+2); printf(手机号码:%sn,send_buf+4); char tmp1024; char tmp_r1024; memcpy(tmp,E,2); memcpy(tmp+2,send_buf+4,15); printf(手机账号:%sn,tmp+2); DataSend(argv4,argv5,tmp,tmp_r); printf(%sn,tmp_r); printf(%sn,tmp_r+2); printf(%sn,tmp_r+4); printf(%sn,tmp_r+6); printf(%sn,tmp_r+21); printf(%sn,tmp_r+57); write(com_fd,tmp_r,1024); exit(0); /回到父进程 if(pid0) wait(0); close(com_fd);/关闭通信套接字 continue; int DataSend(char *service,char *dest,char sed_buf1024,char rcv_buf1024)/参数为服务端口端口号和主机名及需要发送的数据 structhostent *hp;/服务地址 structsockaddr_in sin;/指明连接地址信息 structservent *sp;/服务端口 ints;/连接描述符 /获取服务端口号 if(sp=getservbyname(service,tcp)=NULL) fprintf(stderr,Error: getservbyname); exit(-5); /获取目的主机 if(hp=gethostbyname(dest)=0) fprintf(stderr,Error: gethostbyname); exit(-6); /初始化服务套接字 bzero(&sin,sizeof(sin); bcopy(hp-h_addr,&sin.sin_addr,hp-h_length); sin.sin_family=hp-h_addrtype; sin.sin_port=sp-s_port; if(s=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,Error: socket); exit(-6); if(connect(s,&sin,sizeof(sin)=-1) fprintf(stderr,Error: connect); close(s); exit(-6); /发送数据 /fprintf(stderr,%s is sending request message: %sn,argv0,sed_buf); if(write(s,sed_buf,1024)!=1024) /to server fprintf(stderr,Write Socket s ERRORn!); close(s); exit(-1); if(read(s,rcv_buf,1025)=0) /get replay from server fprintf(stderr,Read Socket s Errorn); close(s); exit(-2); printf(%sn,rcv_buf); /printf(%s get reply: %sn,argv0,sed_buf); close(s); int log(char *filepath,char *buff ) int fd; time_t t = time(0); char tmp64; strftime( tmp, sizeof(tmp), %Y/%m/%d %X %A ,localtime(&t) ); if(fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644)=-1) fprintf(stderr,Log file %s open error!an,log); exit(-1); write(fd,tmp,strlen(tmp); write(fd,:,2); write(fd,buff,strlen(buff); write(fd,n,2); close(fd);银行端:int log(char *filepath,char *buff ) int fd; time_t t = time(0); char tmp64; strftime( tmp, sizeof(tmp), %Y/%m/%d %X %A ,localtime(&t) ); if(fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644)=-1) fprintf(stderr,Log file %s open error!an,log); exit(-1); write(fd,tmp,strlen(tmp); write(fd,:,2); write(fd,buff,strlen(buff); write(fd,n,2); close(fd);int main(int argc,char *argv) int log(char *filepath,char *buff ); char log_file10=bank.log; char log_buf1024; int fd;/日志文件描述符 /网络通信信息 int listen_fd;/监听套接字描述符 int com_fd;/通信套接字描述符 int len;/请求方地址长度 int ret; pid_t pid;/处理请求进程id struct servent *sp;/存放服务器端口信息,从services文件读取 struct sockaddr_in srv_addr;/服务器地址 struct sockaddr_in clt_addr;/客户端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);/创建监听套接字 /数据库连接信息 MYSQL mysql;/MySQL连接 MYSQL_ROW row;/结果的行 MYSQL_RES *result;/查询结果 char myl_buf1024;/存放sql语句 /初始化网络连接参数 if(listen_fds_port; /绑定服务套接字 ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr); if(ret=-1) perror(绑定服务套接字失败); strcat(log_buf,绑定服务套接字失败); log(log_file,log_buf); close(listen_fd); return 1; /监听客户连

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论