文档详情

中国移动手机缴费-交费平台

痛***
实名认证
店铺
DOC
409.87KB
约29页
文档ID:157535582
中国移动手机缴费-交费平台_第1页
1/29

海南大学】《信息分析与设计》设计说明书设计题目:中国移动缴费管理系统 专 业: 信息管理与信息系统 指导教师: 班 级: 学 号: 姓 名: 同 组 人: 计算机与信息工程学院2012年5 月 17 日27前言近年来,随着中国的市场经济的高速发展的情况下,社会上出现了很多新消费模式,由此移动通信行业衍生出很多新的业务,具体情况可总结为以下几点: 人们生活水平的提高,消费项目,服务种类的增加,产生了各种各样好收费项目 在这追求效率的时代,社会需要方便和快捷的缴费方式 通信行业竞争的日益激烈,移动通信的服务意识越来越高,通过各种服务吸引用户,已成为通信公司重要的竞争手段在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。

目录一 前言.................................................................................................1二 系统环境…………………………………………………….........3三 总体设计………………………………………………………….3四 详细设计………………………………………………………….4五 调试与测试……………………………………………………….8六 设计中遇到的问题及解决方法………………………………10七 源程序清单……………………………………………………….11八 总结,收获与体会……………………………………………….28九 参考文献…………………………………………………………28缴费系统一、 系统环境在Linux环境下,使用GNU C或GNU C++,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计二、 设计目的对移动通信话费查询与缴费业务进行了系统全面的分析研究针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。

采用开发工具Linux+Mysql进行系统设计基于UNIX Socket和MySQL数据库,设计一个交易型中间件系统提供通讯转发和协议转换的桥梁作用例如电子商务、银行代理业务软件等都是这种类型软件这里的中间件是指交易型中间件交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软的件,在不同的行业、不同的系统间这里主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件本设计系统能够通过两种方式提供对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑,自动计算出话费的各项合计数据;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报表三、 总体设计程序设计组成框图 实现工具及方法基本功能Linux +Mysql+ VMware Workstation现金支付客户端向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S1方所需数据;重组服务方返回数据,并返回给客户方;留迹;本地业务统计网上缴费客户端向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S2方所需数据;重组服务方返回数据,并返回给客户方;留迹;本地业务统计。

话费查询客户端向中间件发送请求,中间件收到请求后,到数据库里去寻找用户相关交费的表,再返回给客户端,体现在用户面前退出系统当完成一次交易时,就可以退出系统1)中间件模型(2)流程图四、 详细设计1、基本功能1.1现金支付客户到操作台缴纳费用,选择现金支付方式后,输入用户的号码和欲交的话费,客户端根据用户提供的号码向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S1方所需数据;重组服务方返回数据,并返回给客户方1.2网上缴费客户到操作台缴纳费用,选择网上缴费方式后,输入用户的银行卡号、号码和欲交的花费,客户端根据用户提供的号码向中间件发送请求,中间件收到请求后,接收客户方数据;组织服务器S2方所需数据;重组服务方返回数据,并返回给客户方1.3查询通过输入号码就可以得到用户的基本信息,包含用户名,号,余额1.4退出2、函数说明mysql_init(&mysql); // 初始化数据结构mysql_real_connect(&mysql,"localhost","root",0,"mydb",0,NULL,0); //连接数据库mysql_query(&mysql,"SELECT * FROM person");//执行查询语句mysql_queryresult=mysql_store_result(&mysql); //保存结果int socket(int domain, int type, int protocol);// 创建套接字int bind(int sockfd,const struct sockaddr *my_addr, int addrlen);// 绑定本地地址int listen(int s,int backlog);// 监听连接int connect(int sockfd,const structct sockaddr * server_addr, socklen_t addrlen);//建立本地系统和外部系统之间的连接int accept(int s, struct sockaddr *addr, socklen_t addrlen);// 服务器调用,从等待从编号为s的套接字上接受客户连接请求。

send()/write与recv()/read();//数据传输struct servent *getservbyport(int port, const char *protocal);//得到服务器端口号相关的数据结构struct sockaddr_in {short int sin_family; // AF_INETunsigned short int sin_port; // port No.struct in_addr sin_addr; // IP addr.}// IP socket地址3、模块介绍本系统主要是由一个客户机,一个中间件以及两个服务器组成,两个服务器分别负责直接缴费和网上银行缴费以下即是每个模块间的联系图:client发送数据middle第一个字符是2,倒数第二个字符是1倒数第二个字符是1第一个字符为8服务器第一个字符为2,倒数第二个字符为1,加钱倒数第二字符为1第一个字符为1,扣钱银行服务器总体联系图(1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。

2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息转发给哪个服务器通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体3)服务器:本系统有两个服务器,服务器(S2)和银行服务器(S1)1)服务器在这一部分,需要实现的功能是直接缴费它的过程是接收从中间件过来的信息,在服务器的客户账户上相应加上对应的话费,即更新服务器数据库更新成功直接之后,将缴费成功的信息传回中间件具体流程如下:查询用户信息直接缴纳现金 中间件处理更新银行数据库现金缴纳话费工作流程图Service2(服务器)middleclient 注:直接现金缴纳,不需要通过银行服务器从客户端开始流程,最后更新服务器数据库,即缴费成功2)银行服务器在银行服务器这一块,需要实现的功能是网上缴费它的过程是接收从中间件过来的信息,在客户所输入的银行账户上扣除相应的费用;如果在的服务器那一块出现问题,缴费不成功,银行服务器还负责把之前所扣除的话费给加上,具体实现流程如下:更新银行数据库缴费失败返回扣除费用缴费成功从银行卡扣钱switch(v[0][0])查询用户信息选择银行服务器后整个系统的工作流程图Service2(服务器)clientmiddleService2(银行服务器) 5 4 7 1 6 2 36:虚线表示在服务器出错,缴费失败,向银行服务器返回所交的话费。

六、 调试与测试 6.1 调试方法: (1)把数据库文件导入数据库#mysql –u root

2、网上缴费 网上银行缴费,银行服务器与服务器都对信息有相应的操作,缴费得到确认成功后,银行卡上减去100元,话费加上100元3、查询输入用户,查询用户的基本信息信息“1|15993590115|zhongjr|1363.0000000000|0”相对应的意思是“ 操作类型|号|用户名|余额|终止传递信息”4、客户日志文件5、中间件日志文件6、服务器日志文件S1S2七、设计中遇到的问题及解决方法1) 对Mysql 数据库不够了解,对很多数据结构和算法也理解不够牢固,因此我们参考了《Linux+php+Mysql基础与提高》这本书,学到一些关于Mysql的基础知识,才使工作能顺利的进行下去2) 对套接字这样的概念不是很清楚,在老师的和互联网的帮助下,了解了一些这方面的知识,才使我们的设计开展下来3) 以前对服务器,客户端只是了解理论知识,这次而要自己动手来开发服务器,这对我们来说,是一个巨大的挑战,服务器就是一个进程,确切的说是一个守候进程,要实现它的功能,是不容易的事情,你要学会套接字,地址转换,服务器相关的数据结构和算法才能进行开发和设计4) 还是很多基础的东西没有掌握好,基本的算法也没有完全掌握,参考了教科书的相关内容后,才开始了我们的课程设计。

5) 在数据库的编写时,很多要用到的数据类型而我们又没有学过的,只能借助互联网的强大功能了,由此,我们也学到了很多相关的知识八、源程序清单客户机以及两个服务器都会用到strsplit()函数,作用是分解字符串void strsplit(char *s,char **v,char d) { int i,j,l; j=0;v[j]=s; l=strlen(s); for(i=0;i#include #include #include #include #include #include #include #include #include #include #include #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)int set_disp_mode(int option);int getpasswd(char* passwd, int size);int main(int argc,char *argv[]){ int choose; char name[10],passwd[10]; char send_buf[1024]=""; char tmp[1024],phone[30],number[30],pswd[10],money[30],myl_buf[1024],fd_buf[1024]; char log[]="clt.log"; int connect_fd; int ret; int i; int port; int len; int fd; MYSQL mysql; MYSQL_ROW row; MYSQL_RES *result; struct servent *sp; struct hostent *hp; static struct sockaddr_in srv_addr; if(mysql_init(&mysql)==NULL){ fprintf(stderr,"Error in mysql_init!\n"); exit(-1); } if(!mysql_real_connect(&mysql,"localhost","root",0,"users",0,NULL,0)){ fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_close(&mysql); exit(-2); } system("clear");clear: printf("Enter the user name:"); scanf("%s",name); getchar(); set_disp_mode(0); getpasswd(passwd,sizeof(passwd)); set_disp_mode(1); system("clear"); sprintf(myl_buf,"select * from users where name=\"%s\"",name); if(mysql_query(&mysql,myl_buf)!=0){ fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_close(&mysql); exit(-3); } if((result=mysql_store_result(&mysql))==NULL){ fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_free_result(result);mysql_close(&mysql); exit(-4); }; if((mysql_num_rows(result))==0){ printf("use dont exist!\n"); goto clear; } row=mysql_fetch_row(result); if(strcmp(row[1],passwd)!=0){ printf("The passwd is not ture\n"); goto clear; } if((sp=getservbyname(argv[1],"tcp"))==NULL){ fprintf(stderr,"Error:getservbyname"); exit(-1); } if((hp=gethostbyname(argv[2]))==0){ fprintf(stderr,"Error: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("cannot create communication socket"); return 1; } ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1){ perror("cannot connect to the server"); close(connect_fd); return 1; } system("clear"); printf("%s login sucessfully\n",name); printf("1.cash 2.online\n"); printf("3.search 4.exit\n"); printf("Please choose your option :"); scanf("%d",&choose); switch(choose){ case 1: printf("Please input your telephone number: "); scanf("%s",phone); printf("Please input the money you want to submit:"); scanf("%s",money); getchar(); strcat(send_buf,"3|");strcat(send_buf,phone);strcat(send_buf,"|"); strcat(send_buf,money);strcat(send_buf,"|1|"); break; case 2: printf("Please input your phone number:"); scanf("%s",phone); printf("Please input your bank number:"); scanf("%s",number); getchar(); set_disp_mode(0); getpasswd(pswd,sizeof(pswd)); set_disp_mode(1); printf("\n"); printf("Please input the money you want to submit:"); scanf("%s",money); getchar(); strcat(send_buf,"1|");strcat(send_buf,number);strcat(send_buf,"|"); strcat(send_buf,pswd);strcat(send_buf,"|"); strcat(send_buf,money);strcat(send_buf,"|"); strcat(send_buf,phone);strcat(send_buf,"|"); strcat(send_buf,"2|"); break; case 3: printf("Please Enter your phone number:"); scanf("%s",phone); getchar(); strcat(send_buf,"4|");strcat(send_buf,phone); strcat(send_buf,"|1|"); break; case 4: strcpy(send_buf,"3|"); break; default: printf("Please Enter 1,2,3,4!!!!!\n"); printf("Enter Any key to continue..."); getchar(); goto clen; } write(connect_fd,send_buf,strlen(send_buf)+1); len=read(connect_fd,send_buf,1024); close(connect_fd); switch(send_buf[0]){ case '0': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%-10s%-20s%-20s[0k]\n",name,phone,money); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("OPTION SUCCESSFULLY\n"); printf("Please Enter any key to return...\n"); getchar(); strcpy(send_buf,""); goto clen; break; case '1': printf("the information of the is %s\n",send_buf); printf("Please Entry any key to continue...\n"); strcpy(send_buf,""); getchar();goto clen; break; case '3': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%s LOG OUT SUCESSFULLY",phone); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("SUCCESSFULLY LOGOUT!\n"); break; case '5': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK NUMBER WRONG!\n",name,phone,money); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("THE BANK NUMBER IS NOT EXIST\n"); printf("Please Check it\n"); printf("please Enter any key to continue...\n"); getchar(); strcpy(send_buf,"");goto clen; case '8': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] PHONE NUMBER WRONG!\n",name,phone,money); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("THE PHONE USER ISN'T EXIST\n"); printf("Please Check it\n"); printf("Please Enter any key to continue...\n"); getchar(); strcpy(send_buf,"");goto clen; break; case '9': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] BANK PASSWD WRONG!\n",name,phone,money); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("The passwd wrong\n"); printf("Please Enter any key to continue...\n"); getchar(); strcpy(send_buf,"");goto clen; case '7': if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"%-10s%-20s%-20s[FALSE] NOT ENOUGH!\n",name,phone,money); write(fd,fd_buf,strlen(fd_buf)); close(fd); printf("NOt Enough MOney\n"); printf("Please Enter any key to continue...\n"); getchar(); strcpy(send_buf,"");goto clen; default:break; } close(connect_fd); return 0;}int set_disp_mode(int option){ int err; struct termios term; if(tcgetattr(STDIN_FILENO,&term)==-1){ perror("Cannot get the attribution of the terminal"); return 1; } if(option) term.c_lflag|=ECHOFLAGS; else term.c_lflag &=~ECHOFLAGS; err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term); if(err==-1 && err==EINTR){ perror("Cannot set the attribution of the terminal"); return 1; } return 0;}int getpasswd(char* passwd, int size){ int c; int n = 0; printf("Enter the passwd:"); do{ c=getchar(); // if (c != '\n'|c!='\r'){ passwd[n++] = c; // } }while(c != '\n' && c !='\r' && n < (size - 1)); passwd[n-1] = '\0'; return n;}2、中间件#include #include #include #include #include #include #include #include #include #include #include #include #include void strsplit(char *s,char **v,char d);int main(int argc,char *argv[]){ int listen_fd,clt_fd,ser_fd; int com_fd; int ret; int i; int port; int stat; pid_t pid; char flag,fflag; static char recv_buf[1024],snd_buf[1024],buf[1024],ret_buf[1024]="",fd_buf[1024]=""; int len; char **v,**x,d='|'; int fd; char log[]="mid.log"; MYSQL mysql; MYSQL_RES *result; MYSQL_ROW row; struct hostent *hp; struct servent *sp; struct sockaddr_in srv_addr; struct sockaddr_in clt_addr; struct sockaddr_in sc_addr; if(mysql_init(&mysql)==NULL){ fprintf(stderr,"Error in mysql_init!\n"); exit(-1); } if(!mysql_real_connect(&mysql,"localhost","root",0,"middle",0,NULL,0)){ fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_close(&mysql); exit(-2); } listen_fd=socket(PF_INET,SOCK_STREAM,0); if(listen_fd<0){ perror("cannot create listening socket"); return 1; } if((sp=getservbyname(argv[1],"tcp"))==NULL){ fprintf(stderr,"Error:getservbyname"); exit(-1); } memset(&srv_addr,0,sizeof(srv_addr)); srv_addr.sin_family=AF_INET; srv_addr.sin_addr.s_addr=htonl(INADDR_ANY); srv_addr.sin_port=sp->s_port; ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1){ perror("cannot bind server socket"); close(listen_fd); return 1; } ret=listen(listen_fd,10); if(ret==-1){ perror("cannot listen the client connect request"); close(listen_fd); return 1; } while(1){ flag='F',fflag='T'; len=sizeof(clt_addr); com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); if(com_fd<0){ perror("cannot accept client connect request"); close(listen_fd); return 1; } if((pid=fork())==-1){ printf("can't create son proce!\n"); close(com_fd); close(listen_fd); return 2; } if(pid==0){ close(listen_fd); if((len=read(com_fd,recv_buf,1024))>0){ if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"MESSAGE FROM CLIENT:%-40s\n",recv_buf); write(fd,fd_buf,strlen(fd_buf)+1); } if(recv_buf[len-3]=='3'){ strcpy(snd_buf,"3|"); goto zhongjr; }clen: len=strlen(recv_buf); sprintf(buf,"select * from information where service=%d",(recv_buf[len-2]-48)); if(mysql_query(&mysql,buf)!=0){ fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_close(&mysql); exit(-3); } if((result=mysql_store_result(&mysql))==NULL){ fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql)); mysql_free_result(result);mysql_close(&mysql); exit(-4); } row=mysql_fetch_row(result); if((sp=getservbyname(row[1],"tcp"))==NULL){ fprintf(stderr,"Error:getservbyname"); exit(-3); } if((hp=gethostbyname(row[2]))==0){ fprintf(stderr,"Error:gethostbyname"); exit(-4); } clt_fd=socket(PF_INET,SOCK_STREAM,0); if(clt_fd<0){ perror("cannot create communication socket"); return 3; } memset(&sc_addr,0,sizeof(sc_addr)); sc_addr.sin_family=AF_INET; bcopy(hp->h_addr,&sc_addr.sin_addr,hp->h_length); sc_addr.sin_port=sp->s_port; if((connect(clt_fd,(struct sockaddr*)&sc_addr,sizeof(sc_addr)))==-1){ perror("cannot connect to the server"); close(clt_fd); return 4; } memset(snd_buf,0,1024); strncpy(snd_buf,recv_buf,len-2); write(clt_fd,snd_buf,len); read(clt_fd,snd_buf,1024); close(clt_fd); switch(recv_buf[len-2]) { case '0': break; case '1'://中间件返回 if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"MESSAGE FROM PHONE:%-40s\n",snd_buf); write(fd,fd_buf,strlen(fd_buf)+1); close(fd); if(snd_buf[0]=='8'){ snd_buf[0]='2'; strcpy(recv_buf,snd_buf); strcpy(snd_buf,"8|"); flag='T'; } break; case '2'://从银行回来还得再次处理 if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } sprintf(fd_buf,"MESSAGE FROM BANK:%-40s\n",snd_buf); write(fd,fd_buf,strlen(fd_buf)+1); close(fd); if(snd_buf[0]=='0'){ strcpy(recv_buf,snd_buf);recv_buf[0]='2';printf("recv_buf%s\n",recv_buf);goto clen; } if(snd_buf[0]=='6'){ goto withme; } break; default :; }zhongjr: if(fflag=='T'){ write(com_fd,snd_buf,strlen(snd_buf)+1);//给客户只写一次 fflag=='F'; } withme: if(flag=='T') {flag='F';goto clen;} //第二次goto执行的时候 close(com_fd); exit(0); } if(pid>0){ close(com_fd); continue; } }}3、银行服务器在建立好了所有的连接之后,函数进入一个死循环,来处理其主要的功能while(1){ len=sizeof(clt_addr); com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); //返回一个新的套接字,与申请连接的客户机进行连接 if(com_fd<0){ //服务器等待连接失败 perror("cannot accept client connect request"); close(listen_fd); return 1; } if((pid=fork())==-1){ //建立子进程用来进行处理客户机的请求信息 printf("error !!!\n"); return 1; } if(pid==0){ close(listen_fd); if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){ fprintf(stderr,"Log file %s open error!\a\n",log); exit(-1); } len=read(com_fd,recv_buf,1024); strncpy(save_buf,recv_buf,len-2); strsplit(recv_buf,v,d); sprintf(buf,"select * from information where number=\"%s\"",v[1]); //用buf存入需查询的sql语言信息 if(mysql_query(&mysql,buf)!=0){ //执行buf中的sql语句 fprintf(stderr,"Error in query: %s [%d]\n",mysql_erro。

下载提示
相关文档
正为您匹配相似的精品文档