《网上购物系统项目开发总结报告(共20页).doc》由会员分享,可在线阅读,更多相关《网上购物系统项目开发总结报告(共20页).doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 一前言 在Linux环境下,使用GNU C或GNU C+,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。本次设计运用c语言为基础编程,同时联系数据库的使用和有关unix_socket的使用,但这部分类容对我们来说是相当生疏的,以前没有正式的学过。先在老师的引导下学了解了基本类容。我们做的是购物系统根据设计的要求必须要在完成通信功能的基础上,完成自己设计所要完成的功能。整个设计的中心类容就是要在运用数据库的基础上完成客户端和服务器的通信,所以我们一组的人先运用c语言完成对基本的程序要求,然后
2、再根据所要完成的功能重用的数据库的类容创建数据库可所要的表。 设计过程中由于用到好多套接字的内容,好多函数的运用都很生疏,我们一组的人在一起商量外,还大量利用网络资源,尤其是在运用一些数据库的函数进行编程的时候更是进度很慢,在写程序的过程中还得像这怎么把数据库的内容在运行是能起上作用,总之整个过程并不是像刚开始时想的那么简单。目录一设计时间及地点.二、设计目的和要求.三、设计题目和内容.四、设计方法和步骤.五.、流程图六、设计成果的编制.七、程序代码 . 八、心得体会一设计时间及地点 这次设计整个过程我们在都在院机房,从8月25开始的设计,第一天我们先进行总体大的框架的构想,想出有关购物系统所
3、要完成的功能,在对所要写的程序进行整体的划分,总基础整个过程所要设计学过的和要运用的刚了解的东西,大的思路出来以后再对组中的成员进行工作分工,前两天我们所完成的主要的工作就是了解并能掌握在进程之间的通信,这是整个设计最基础的东西,也是最最重要的地方。然后解下来的时间就是对程序的构思和写就,因为在写程序的过程中要用到数据库的类容,所以在程序写出一部分以后在今测试的都要建立相应的数据库。测试和调试出来很多的问题,在老师和同学的帮助下最后都解决了。 二、设计目的和要求 1、设计目的这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯和协议转换的软件,在不同的行业、不同的系统间
4、提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型的软件。本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件中间件,尤其掌握这种设计的思想和方法。在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。这里有政策的因素,有制度的要求,也有技术的成份。设计理念:设计一个项目,学会一个方法,做好一项工程。2、设计要求1)纪律要求(1)严格遵循软件实习的有关安排,按时
5、完成设计任务。(2)严格遵守学校的纪律和机房的各项管理规定。(3)严格请假制度,需请假时,必须经指导老师批准。2)技术要求按软件工程的思想和方法来设计这一项目,并把它作为一个工程来做。设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。因不是针对某个具体业务系统的,该系统的设计只是一个大的框架,但要求对实际系统进行模拟,能针对实际系统更好。建议模拟移动公司的手机代收费系统。要求本设计的三部分都要对所接收和发送的数据以文件形式留迹并同时在屏幕上显示。客户端要求对接收到的返回数据进行正确格式的显示或打印。
6、服务器端要先建立模拟用数据文件或数据库,这是服务的基础。服务器数据库要求使用Linux提供的免费的MySQL。开发时主要用到C访问MySql的接口程序MySql C API。该设计的三个部分都要设计出程序,并要在验收时进行演示。3)具体要求(1)客户端客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,定义在/etc/services中,比如mysvr1 5678),另一个是目的主机(定义在/etc/hosts内,也可使用DNS来解析),缺省时为本机。客户至少要实现如下功能:用户管理;查询;交易(交费,购物等);撤销;统计。(2)中间件中间件程序命名为middlewar
7、e,要带有三个参数,一个是服务器的服务(名字,与客户端同),第二个作为请求的服务(自己定义,定义在/etc/services中,要区别于客户端,比如mysvr2 5679),第三个为目的主机(定义在/etc/hosts内),缺省时为本机。中间件要完成与客户要求相符的功能:是本地的本地处理,否则发往服务器方。具体地是:接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方。(3)服务器服务器程序可命名为server,要求带有一个服务参数,与中间件的mysvr2同。服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。(4)留迹或log留迹或log工作在客户端、中间件和
8、服务器三方都要做,以供统计或核对使用。客户端或中间件方可以使用文本文件或数据库,但在服务器方张须使用MySql数据三流程图如下 1.注册功能流程图 注册入口必选项为空用户名有效?2次输入密码是否一致?密码长度符合要求?Email地址有效?其他信息有效?注册成功否否否否否是是否是否是是是 2商品搜索流程图开始搜索输入条件搜索结果查看商品购物车下订单继续搜索是否3用户登录流程图登录入口取得用户名和密码将UserID存入session中查询用户是否存在核对密码是否正确登录成功是是否否 4.购物流程图浏览商品选择商品订购商品去收银台提交订单未注册用户已登录注册用户未登录注册用户注册登录四.客户端的功能
9、实现部分及源代码 客户端是打开一通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求,等待并接收应答;请求结束后关闭通信通道。socket程序库是UNIX网络上最普及的API,可调用socket程序库提供的各个程序开发网络软件和网络系统。TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/0操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系
10、统,使TCP/IP的应用有更大的发展,其网络应用编程界面(套接字)在网络软件中被广泛应用其中和套接字有关的函数有:创建套接字socket() 地址绑定bind() 建立连接connect()与accept()监听连接listen() 数据传输send()/write()与recv()/read() 关闭套接字close() 。数据可中所用的东西有:在命令提示符下输入:mysql 或 mysql u root进入mysql系统。提示符为“”,可以使用的命令有:show databases / tables;use database;create database db;create table
11、tbl;drop database db/ table tbl;select from tbl where insert into tbl values update tbl set where delete from tbl where 因为我们要完成的事网上购物系统,所以客户端组要是完成查询可购买的功能,所以所用的到数据库也相对的简单。客户端部分源代码#include #include #include #include #include #include #include #include #definerec_length20main(int argc,char *argv) stru
12、cthostent *hp; structsockaddr_in sin; structservent *sp; char c; charbuff1000,cmd500,spname13,spnum6; ints,err_code,recs,flds,i,rd_l,wr_l; int op; char *service,*dest,*log=clt.log;MYSQLmysql;MYSQL_RES*result;MYSQL_ROWrow;1.运用unix_socket的内容完成服务器与客户端的基本定义: if(argc!=1) service=argv1; dest=argv2; else f
13、printf(stderr,NO service assigned!nUsage:);fprintf(stderr,%s service_name destination!n,argv0);fprintf(stderr,Note: service_name is defined in /etc/servicesn);fprintf(stderr, destination is defined in /etc/hostsn);exit(-1); sprintf(cmd,touch %s,log);system(cmd);err_code=0;if(mysql_init(&mysql)=NULL)
14、/2fprintf(stderr,Error in mysql_init!n);exit(-1);/22.把服务器与客户端通过说句库连接起来,并完成基本的通信功能。/connect to DBif(!mysql_real_connect(&mysql,localhost,root,0,clt,0,NULL,0)/2 fprintf(stderr,Error in connection: %s %dn,mysql_error(&mysql),mysql_errno(&mysql); mysql_close(&mysql); err_code=-2; goto mysql_err;/2/query
15、();sprintf(cmd,SELECT * FROM main);/execute queryif(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);/mysql_close(&mysql);err_code=-3;goto mysql_err;/5/get resultif(result=mysql_store_result(&mysql)=NULL)/5fprintf(stderr,Error in store_result
16、: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);mysql_free_result(result);/mysql_close(&mysql);err_code=-4;goto mysql_err;/5mysql_err:if(err_code!=0)mysql_close(&mysql); exit(-1);/sprintf(buff,1|);recs=mysql_num_rows(result);flds=mysql_num_fields(result);if(recs=0) fprintf(stderr,No Data in Table U
17、NIT);goto mysql_err2;/process result setbzero(buff,500);printf(ninput the name of goods:);scanf(%s,spname); spname13=0;row=mysql_fetch_row(result);getdate(cmd);/getdate Date + unit_code + jnlsprintf(buff,1|%s|%8.8s%4.4s%5.5d|%4.4s|,spname,cmd,row0,atoi(row1),row0);printf(n=%s=n,buff);/i=atoi(row1) +
18、 1;sprintf(cmd,UPDATE main set curr_jnl=%d where unit_id=%s,i,row0);/fprintf(stderr,%sn,cmd);if(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);/mysql_close(&mysql);err_code=-3;goto mysql_err;/5mysql_err2:mysql_free_result(result);mysql_err1
19、:mysql_close(&mysql);leb_send: 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_por
20、t=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);/ next 2 Line build request message if(wr_l=write(s,buff,strlen(buff)!=strlen(buff) /to server fprintf(stderr,Write Socket s E
21、RRORn!); close(s); exit(-1); if(rd_l=read(s,cmd,500)=0) /get replay from server fprintf(stderr,Read Socket s Errorn); close(s); exit(-2); close(s); printf(%stsend: %sntget reply:(%d Bs) %sn,argv0,buff,rd_l,cmd);cmdrd_l=0;buffwr_l=0;strcat(buff,|OKOK|);wr_l+=6;strncat(buff,cmd,rd_l);wr_l+=rd_l;buffwr
22、_l+=n;if(flds=open(log,O_WRONLY|O_APPEND)=-1)fprintf(stderr,File %s open error!n,log);exit(-5);if(write(flds,buff,wr_l)!=wr_l)fprintf(stderr,File %s write error!n,log);close(flds); exit(-6);close(flds);while(1) bzero(buff,500);bzero(spnum,6);getdate(cmd); printf(other transactions:);printf( nplease
23、input your option:1:query2:buy 3:print4:quit(q/Q)n);scanf(%d,&op);if(op=4) exit(0);if(op=2) printf( n number:);scanf(%s,spnum);spnum6=0;sprintf(buff,%1.1d|%s|%s|%8.8s%4.4s|%5.5d|%4.4s|,op,spname,spnu m,cmd,row0,atoi(row1),row0);printf(n=%s=n,buff);/goto leb_send; exit(0);getdate(char *d)inti;time_tt
24、,t1;struct tm *t_m;if(t=time(&t1)=-1) return -1;t_m=localtime(&t);sprintf(d,%4.4d%2.2d%2.2d,t_m-tm_year+1900,t_m-tm_mon+1,t_m-tm_mday);d8=0;return 0;3,服务器端的功能实现及源代码 服务器端所用到的函数与客服端的几乎是一样的,用到套接字的内容,和数据库的东西,但是其中的数据库要相对复杂。他可以接收来自客服端的命令请求,并分析命令然通过数据库对客服端的请求给予答复。 服务器端的源代码为 #include #include #include #incl
25、ude #include #include #include #include#define rec_length20void strsplit(char *,char *,char );main(int argc, char *argv )/1 main struct sockaddr_in sin; struct servent *sp; int s,ns,pid;chard=|,tmp1000,buff500,cmd500;char *service,*log=svr.log;/chars=1234|567|7|90|abcd|efghijklmnop|;char*str;char*v1
26、00,*tt;inti,j,recs,flds,err_code,c,rd_l,wr_l;doublepay;/declare structure and vars.MYSQLmysql;MYSQL_RES*result;MYSQL_ROWrow;if(argc!=1) service=argv1;else /2 fprintf(stderr,NO service assigned!nUsage:n); fprintf(stderr,t%s server_name!n,argv0); fprintf(stderr,Note: svr_name is defined in file /etc/s
27、ervicesn); exit(-1);/2sprintf(cmd,touch %s,log);system(cmd);for(i=0;is_port; if(bind(s,&sin,sizeof(sin)=-1)/2fprintf(stderr,Error: bind);close(s); exit(-6);/2 if(listen(s,5)=-1)/2fprintf(stderr,Error: listen);close(s); exit(-6);/2 while(1)/2 while fprintf(stderr,nttt Now wait connect .n);if(ns=accep
28、t(s,0,0)=-1) / wait a connection /3 fprintf(stderr,error: accept); continue; /3err_code=0; 2. 进程的使用,创建子进程来处理客户机所发来的信息:if(pid=fork()=-1) /conneted, and then create child proc/3 fprintf(stderr,server: fork error!); close(s); exit(-1); /3if(pid!=0)/parent proce,nothing to do, and to the next loop/3clos
29、e(ns);wait(0);continue;/3if(pid=0) / entered child proccedure/3 pid=0 close(s); printf(Receive a client connect:%sn,argv1); if(rd_l=read(ns,buff,500)=0)/4fprintf(stderr,Read nothing from socket:nsn);close(ns); exit(-3);/4 printf(%s get message from ns: %sn,argv0,buff);buffrd_l=0;strcpy(tmp,buff);str
30、cat(tmp,|OKOK|);rd_l+=4; 3. 运用unix_Socket实现所要完成的功能strsplit(buff,v,d);switch(v00) /4 switchcase 1:/query();sprintf(cmd,SELECT * FROM sp WHERE spname=%s,v1);/execute queryprintf(nCMD=%sn,cmd);if(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);
31、/mysql_close(&mysql);err_code=-3;goto mysql_err;/5/get resultif(result=mysql_store_result(&mysql)=NULL)/5fprintf(stderr,Error in store_result: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);mysql_free_result(result);/mysql_close(&mysql);err_code=-4;goto mysql_err;/5mysql_err:sprintf(buff,%2.2d|,err_
32、code);if(err_code!=0) goto mysql_err1;recs=mysql_num_rows(result);flds=mysql_num_fields(result);for(i=0;irecs;i+)/5/process result setif(recs=0) sprintf(cmd,00|);elsesprintf(cmd,%2.2d|,recs);strcat(buff,cmd);row=mysql_fetch_row(result);/pay=atof(v2)+atof(row2);/printf(%f,&row2);/printf(n);for(j=0;jf
33、lds;j+)/6sprintf(cmd,%s|,rowj);strcat(buff,cmd);/6printf(nBUFF form DB=%sn,buff);mysql_free_result(result);mysql_err1:mysql_close(&mysql);break;case 2:/trans();sprintf(cmd,UPDATE sp SET spnu =spnu-%s where spname=%s,v2,v1);/execute queryprintf(nCMD=%sn,cmd);if(mysql_query(&mysql,cmd)!=0)/5fprintf(st
34、derr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);/mysql_close(&mysql);err_code=-3;goto mysql_err;/sprintf(tt,);sprintf(cmd,UPDATE payment SET transtime=%swhere sp_id=%s, v3, v1);/execute queryprintf(nCMD=%sn,cmd);if(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %d
35、n,mysql_error(&mysql),mysql_errno(&mysql);/mysql_close(&mysql);err_code=-3;goto mysql_err;/*sprintf(cmd,UPDATE main SET curr_jn1=%dwhere unit_id=%s, v5,v6);/execute queryprintf(nCMD=%sn,cmd);if(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql)
36、;/mysql_close(&mysql);err_code=-3;goto mysql_err; */*sprintf(cmd,SELECT * FROM main);/execute queryif(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Error in query: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);/mysql_close(&mysql);err_code=-3;goto mysql_err;/5/get resultif(result=mysql_store_result(&
37、mysql)=NULL)/5fprintf(stderr,Error in store_result: %s %dn,mysql_error(&mysql),mysql_errno(&mysql);mysql_free_result(result);/mysql_close(&mysql);err_code=-4;goto mysql_err;/5mysql_err:if(err_code!=0)mysql_close(&mysql); exit(-1);/sprintf(buff,1|);recs=mysql_num_rows(result);flds=mysql_num_fields(result);if(recs=0) fprintf(stderr,No Data in Table UNIT);goto mysql_err2; k=atoi(row3) + 1;sprintf(cmd,UPDATE main set curr_jnl=%d where unit_id=%s,i,row0); if(mysql_query(&mysql,cmd)!=0)/5fprintf(stderr,Err