




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【海南大学】信息分析与设计设计说明书设计题目:中国移动手机缴费管理系统 专 业: 信息管理与信息系统 指导教师: 班 级: 学 号: 姓 名: 同 组 人: 计算机与信息工程学院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);/得到服务器端口号相关的数据结构structsockaddr_in short intsin_family;/ AF_INETunsigned short int sin_port;/ port No.struct in_addrsin_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(v00)查询用户信息选择银行服务器后整个系统的工作流程图Service2(手机服务器)clientmiddleService2(银行服务器) 54716 236:虚线表示在手机服务器出错,缴费失败,向银行服务器返回所交的话费。六、 调试与测试 6.1 调试方法: (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(4) 创建服务端口#ivi /etc/services进入新创建三个名字zhongjr 500/tcpworl 501/tcpx 502/tcp保存并退出vi创建一个域名#ivi /etc/hosts进入新创建一个域名myhttp保存并退出vi(5) 运行程序#./m1 x切换到终端2#./s1 world切换到终端3#./s2 zhongjr切换到终端4#./m1 x myhttp6.2测试结果及简单分析1、现金支付缴费后手机服务器接受信息,对用户手机费用进行操作,操作后用户手机费用增加123元。2、网上缴费 网上银行缴费,银行服务器与手机服务器都对信息有相应的操作,缴费得到确认成功后,银行卡上减去100元,手机话费加上100元。3、查询输入手机用户,查询用户的基本信息。信息“1zhongjr|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) inti,j,l;j=0;vj=s;l=strlen(s);for(i=0;il;i+)if(*(s+i)!=|) continue;else *(s+i)=0;v+j=s+i+1;以下是每个模块中将实现其功能的部分重要代码。1、 客户机#include #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 name10,passwd10;char send_buf1024=;char tmp1024,phone30,number30,pswd10,money30,myl_buf1024,fd_buf1024;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 %dn,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 %dn,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 %dn,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(row1,passwd)!=0)printf(The passwd is not turen);goto clear;if(sp=getservbyname(argv1,tcp)=NULL)fprintf(stderr,Error:getservbyname);exit(-1);if(hp=gethostbyname(argv2)=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_fd0)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 sucessfullyn,name);printf(1.cash 2.onlinen);printf(3.search4.exitn);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_buf0)case 0:if(fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644)=-1)fprintf(stderr,Log file %s open error!an,log);exit(-1);sprintf(fd_buf,%-10s%-20s%-20s0kn,name,phone,money);write(fd,fd_buf,strlen(fd_buf);close(fd);printf(OPTION SUCCESSFULLYn);printf(Please Enter any key to return.n);getchar();strcpy(send_buf,);goto clen;break;case 1:printf(the information of the is %sn,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!an,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!an,log);exit(-1);sprintf(fd_buf,%-10s%-20s%-20sFALSEBANK NUMBER WRONG!n,name,phone,money);write(fd,fd_buf,strlen(fd_buf);close(fd);printf(THE BANK NUMBER IS NOT EXISTn);printf(Please Check itn);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!an,log);exit(-1);sprintf(fd_buf,%-10s%-20s%-20sFALSEPHONE NUMBER WRONG!n,name,phone,money);write(fd,fd_buf,strlen(fd_buf);close(fd);printf(THE PHONE USER ISNT EXISTn);printf(Please Check itn);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!an,log);exit(-1);sprintf(fd_buf,%-10s%-20s%-20sFALSEBANK PASSWD WRONG!n,name,phone,money);write(fd,fd_buf,strlen(fd_buf);close(fd);printf(The passwd wrongn);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!an,log);exit(-1);sprintf(fd_buf,%-10s%-20s%-20sFALSENOT ENOUGH!n,name,phone,money);write(fd,fd_buf,strlen(fd_buf);close(fd);printf(NOt Enough MOneyn);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) passwdn+ = c; / while(c != n & c !=r & n (size - 1); passwdn-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_buf1024,snd_buf1024,buf1024,ret_buf1024=,fd_buf1024=;int len;char *v,*x,d=|;int fd;char log=mid.log;MYSQLmysql;MYSQL_RES*result;MYSQL_ROWrow;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 %dn,mysql_error(&mysql),mysql_errno(&mysql);mysql_close(&mysql); exit(-2);listen_fd=socket(PF_INET,SOCK_STREAM,0);if(listen_fds_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_fd0)if(fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644)=-1)fprintf(stderr,Log file %s open error!an,log);exit(-1);sprintf(fd_buf,MESSAGE FROM CLIENT:%-40sn,recv_buf);write(fd,fd_buf,strlen(fd_buf)+1);if(recv_buflen-3=3)strcpy(snd_buf,3|);goto zhongjr;clen:len=strlen(recv_buf);sprintf(buf,select * from information where service=%d,(recv_buflen-2-48);if(mysql_query(&mysql,buf)!=0)fprintf(stderr,Error in query: %s %dn,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 %dn,mysql_error(&mysql),mysql_errno(&mysql);mysql_free_result(result);mysql_close(&mysql); exit(-4);row=mysql_fetch_row(result);if(sp=getservbyname(row1,tcp)=NULL)fprintf(stderr,Error:getservbyname);exit(-3);if(hp=gethostbyname(row2)=0)fprintf(stderr,Error:gethostbyname);exit(-4);clt_fd=socket(PF_INET,SOCK_STREAM,0);if(clt_fdh_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_buflen-2)case 0:break;case 1:/中间件返回if(fd=open(log,O_WRON
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 激光行业人才发展与职业路径探讨试题及答案
- 特殊灾难测试题及答案
- 知识竞赛试题及答案
- 药剂学居民健康考核试题及答案
- 药物政策与行业发展试题及答案
- 初级会计师财务分析技能试题及答案
- 网络规划设计师考试全景分析及试题及答案
- 2025年-黑龙江建筑安全员知识题库
- 税务合规违约的后果分析试题及答案
- 知识产权的社会功能与法律保障试题及答案
- 宁夏中考试题历史及答案
- 2024-2025学年二年级语文下册统编版第四单元达标卷(单元测试)(含答案)
- 2025年郑州澍青医学高等专科学校单招职业适应性测试题库新版
- 《企业运营管理基础》课件
- 《马达保护器培训》课件
- 2024年01月广发银行2024年境内直属分行(大连分行)副行长职位选聘笔试历年参考题库附带答案详解
- 2025年水稻种植农户互助合作合同3篇
- 第19课《资本主义国家的新变化》说课稿-2023-2024学年高一下学期统编版(2019)必修中外历史纲要下
- 口腔颌面外科基础知识与基本操作
- 2025年福建泉州交通发展集团招聘笔试参考题库含答案解析
- 大数据背景下的高血压诊断与治疗效果研究
评论
0/150
提交评论