网上购物系统项目开发总结报告.docx
- 文档编号:4440100
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:24
- 大小:140.44KB
网上购物系统项目开发总结报告.docx
《网上购物系统项目开发总结报告.docx》由会员分享,可在线阅读,更多相关《网上购物系统项目开发总结报告.docx(24页珍藏版)》请在冰豆网上搜索。
网上购物系统项目开发总结报告
一.前言
在Linux环境下,使用GNUC或GNUC++,在UNIX/Linuxmake开发工具的的管理和控制下,利用UNIX/LinuxSocket库在网络的底层进行开发设计。
本次设计运用c语言为基础编程,同时联系数据库的使用和有关unix_socket的使用,但这部分类容对我们来说是相当生疏的,以前没有正式的学过。
先在老师的引导下学了解了基本类容。
我们做的是购物系统根据设计的要求必须要在完成通信功能的基础上,完成自己设计所要完成的功能。
整个设计的中心类容就是要在运用数据库的基础上完成客户端和服务器的通信,所以我们一组的人先运用c语言完成对基本的程序要求,然后再根据所要完成的功能重用的数据库的类容创建数据库可所要的表。
设计过程中由于用到好多套接字的内容,好多函数的运用都很生疏,我们一组的人在一起商量外,还大量利用网络资源,尤其是在运用一些数据库的函数进行编程的时候更是进度很慢,在写程序的过程中还得像这怎么把数据库的内容在运行是能起上作用,总之整个过程并不是像刚开始时想的那么简单。
一设计时间及地点………………………………………………………..
二、设计目的和要求……………………………………………………….
三、设计题目和内容………………………………………………………..
..
四、设计方法和步骤…………………………………………………….
五.、流程图…………………………………………………
六、设计成果的编制……………………………………..
七、程序代码………………………………………………………..
八、心得体会……………………………………………………
一设计时间及地点
这次设计整个过程我们在都在院机房,从8月25开始的设计,第一天我们先进行总体大的框架的构想,想出有关购物系统所要完成的功能,在对所要写的程序进行整体的划分,总基础整个过程所要设计学过的和要运用的刚了解的东西,大的思路出来以后再对组中的成员进行工作分工,前两天我们所完成的主要的工作就是了解并能掌握在进程之间的通信,这是整个设计最基础的东西,也是最最重要的地方。
然后解下来的时间就是对程序的构思和写就,因为在写程序的过程中要用到数据库的类容,所以在程序写出一部分以后在今测试的都要建立相应的数据库。
测试和调试出来很多的问题,在老师和同学的帮助下最后都解决了。
二、设计目的和要求
1、设计目的
这里的中间件是指交易型中间件。
交易型中间件是指用在不同行业、不同部门间的通讯和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。
例如电子商务、银行代理业务软件等都是这种类型的软件。
本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。
本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。
在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。
这里有政策的因素,有制度的要求,也有技术的成份。
设计理念:
设计一个项目,学会一个方法,做好一项工程。
2、设计要求
1)纪律要求
(1)严格遵循软件实习的有关安排,按时完成设计任务。
(2)严格遵守学校的纪律和机房的各项管理规定。
(3)严格请假制度,需请假时,必须经指导老师批准。
2)技术要求
按软件工程的思想和方法来设计这一项目,并把它作为一个工程来做。
设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。
最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。
因不是针对某个具体业务系统的,该系统的设计只是一个大的框架,但要求对实际系统进行模拟,能针对实际系统更好。
建议模拟移动公司的手机代收费系统。
要求本设计的三部分都要对所接收和发送的数据以文件形式留迹并同时在屏幕上显示。
客户端要求对接收到的返回数据进行正确格式的显示或打印。
服务器端要先建立模拟用数据文件或数据库,这是服务的基础。
服务器数据库要求使用Linux提供的免费的MySQL。
开发时主要用到C访问MySql的接口程序MySqlCAPI。
该设计的三个部分都要设计出程序,并要在验收时进行演示。
3)具体要求
(1)客户端
客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,定义在/etc/services中,比如mysvr15678),另一个是目的主机(定义在/etc/hosts内,也可使用DNS来解析),缺省时为本机。
客户至少要实现如下功能:
用户管理;查询;交易(交费,购物等);撤销;统计。
(2)中间件
中间件程序命名为middleware,要带有三个参数,一个是服务器的服务(名字,与客户端同),第二个作为请求的服务(自己定义,定义在/etc/services中,要区别于客户端,比如mysvr25679),第三个为目的主机(定义在/etc/hosts内),缺省时为本机。
中间件要完成与客户要求相符的功能:
是本地的本地处理,否则发往服务器方。
具体地是:
接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方。
(3)服务器
服务器程序可命名为server,要求带有一个服务参数,与中间件的mysvr2同。
服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。
(4)留迹或log
留迹或log工作在客户端、中间件和服务器三方都要做,以供统计或核对使用。
客户端或中间件方可以使用文本文件或数据库,但在服务器方张须使用MySql数据
三.流程图如下
1.注册功能流程图
2.商品搜索流程图
3.用户登录流程图
4.购物流程图
四.客户端的功能实现部分及源代码
•
客户端是打开一通信通道,并连接到服务器所在主机的特定端口。
向服务器发服务请求,等待并接收应答;请求结束后关闭通信通道。
socket程序库是UNIX网络上最普及的API,可调用socket程序库提供的各个程序开发网络软件和网络系统。
TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/0操作。
UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。
在UNIX系统中,网络应用编程界面有两类:
UNIXBSD的套接字(socket)和UNIXSystemV的TLI。
由于Sun公司采用了支持TCP/IP的UNIXBSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面(套接字)在网络软件中被广泛应用其中和套接字有关的函数有:
创建套接字—socket()地址绑定—bind()建立连接—connect()与accept()监听连接—listen()数据传输—send()/write()与recv()/read()关闭套接字—close()。
数据可中所用的东西有:
在命令提示符下输入:
mysql或mysql–uroot进入mysql系统。
提示符为“>”,可以使用的命令有:
showdatabases/tables;usedatabase;createdatabasedb;createtabletbl;dropdatabasedb/tabletbl;select…fromtbl…where…insert…intotbl…values…update…tbl…set…where…delete…fromtbl…where…
因为我们要完成的事网上购物系统,所以客户端组要是完成查询可购买的功能,所以所用的到数据库也相对的简单。
客户端部分源代码
#include
#include
#include
#include
#include
#include
#include
#include
#definerec_length20
main(intargc,char**argv)
{
structhostent*hp;
structsockaddr_insin;
structservent*sp;
charc;
charbuff[1000],cmd[500],spname[13],spnum[6];
ints,err_code,recs,flds,i,rd_l,wr_l;
intop;
char*service,*dest,*log="clt.log";
MYSQLmysql;
MYSQL_RES*result;
MYSQL_ROWrow;
1.运用unix_socket的内容完成服务器与客户端的基本定义:
if(argc!
=1){service=argv[1];dest=argv[2];}
else{
fprintf(stderr,"NOserviceassigned!
\nUsage:
");
fprintf(stderr,"%sservice_namedestination!
\n",argv[0]);
fprintf(stderr,"Note:
service_nameisdefinedin/etc/services\n");
fprintf(stderr,"destinationisdefinedin/etc/hosts\n");
exit(-1);
}
sprintf(cmd,"touch%s",log);system(cmd);
err_code=0;
if(mysql_init(&mysql)==NULL){//2
fprintf(stderr,"Errorinmysql_init!
\n");
exit(-1);
}//2
2.把服务器与客户端通过说句库连接起来,并完成基本的通信功能。
//connecttoDB
if(!
mysql_real_connect(&mysql,"localhost","root",0,"clt",0,NULL,0)){//2
fprintf(stderr,"Errorinconnection:
%s[%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql);
err_code=-2;
gotomysql_err;
}//2
//query();
sprintf(cmd,"SELECT*FROMmain");
//executequery
if(mysql_query(&mysql,cmd)!
=0){//5
fprintf(stderr,"Errorinquery:
%s[%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
//mysql_close(&mysql);
err_code=-3;
gotomysql_err;
}//5
//getresult
if((result=mysql_store_result(&mysql))==NULL){//5
fprintf(stderr,"Errorinstore_result:
%s[%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
//mysql_close(&mysql);
err_code=-4;
gotomysql_err;
}//5
mysql_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,"NoDatainTableUNIT");
gotomysql_err2;
}
//processresultset
bzero(buff,500);
printf("\ninputthenameofgoods:
");
scanf("%s",spname);spname[13]='\0';
row=mysql_fetch_row(result);
getdate(cmd);
//getdateDate+unit_code+jnl
sprintf(buff,"1|%s|%8.8s%4.4s%5.5d|%4.4s|",spname,cmd,row[0],atoi(row[1]),row[0]);
printf("\n===%s===\n",buff);//
i=atoi(row[1])+1;
sprintf(cmd,"UPDATEmainsetcurr_jnl=\'%d\'whereunit_id=\'%s\'",i,row[0]);
//fprintf(stderr,"%s\n",cmd);
if(mysql_query(&mysql,cmd)!
=0){//5
fprintf(stderr,"Errorinquery:
%s[%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
//mysql_close(&mysql);
err_code=-3;
gotomysql_err;
}//5
mysql_err2:
mysql_free_result(result);
mysql_err1:
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_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);
}
//next2Linebuildrequestmessage
if((wr_l=write(s,buff,strlen(buff)))!
=strlen(buff)){//toserver
fprintf(stderr,"WriteSocketsERROR\n!
");
close(s);exit(-1);
}
if((rd_l=read(s,cmd,500))==0){//getreplayfromserver
fprintf(stderr,"ReadSocketsError\n");
close(s);exit(-2);
}
close(s);
printf("%s\tsend:
%s\n\tgetreply:
(%dBs)%s\n",argv[0],buff,rd_l,cmd);
cmd[rd_l]='\0';
buff[wr_l]='\0';strcat(buff,"|OKOK|");wr_l+=6;
strncat(buff,cmd,rd_l);wr_l+=rd_l;buff[wr_l++]='\n';
if((flds=open(log,O_WRONLY|O_APPEND))==-1){
fprintf(stderr,"File%sopenerror!
\n",log);
exit(-5);
}
if(write(flds,buff,wr_l)!
=wr_l){
fprintf(stderr,"File%swriteerror!
\n",log);
close(flds);exit(-6);
}
close(flds);
while
(1){bzero(buff,500);
bzero(spnum,6);
getdate(cmd);
printf("othertransactions:
");
printf("\npleaseinputyouroption:
1:
query2:
buy3:
print4:
quit(q/Q)\n");
scanf("%d",&op);
if(op==4)exit(0);
if(op==2){
printf("\nnumber:
");
scanf("%s",spnum);spnum[6]='\0';
}
sprintf(buff,"%1.1d|%s|%s|%8.8s%4.4s|%5.5d|%4.4s|",op,spname,spnum,cmd,row[0],atoi(row[1]),row[0]);
printf("\n===%s===\n",buff);//
gotoleb_send;
}
exit(0);
}
getdate(char*d)
{inti;time_tt,t1;
structtm*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);
d[8]='\0';
return0;
}
3,服务器端的功能实现及源代码
服务器端所用到的函数与客服端的几乎是一样的,用到套接字的内容,和数据库的东西,但是其中的数据库要相对复杂。
他可以接收来自客服端的命令请求,并分析命令然通过数据库对客服端的请求给予答复。
服务器端的源代码为
#include
#include
#include
#include
#include
#include
#include
#include
#definerec_length20
voidstrsplit(char*,char**,char);
main(intargc,char**argv)
{//1main
structsockaddr_insin;
structservent*sp;
ints,ns,pid;
chard='|',tmp[1000],buff[500],cmd[500];
char*service,*log="svr.log";
//chars[]="1234|567|7|90|abcd|efghijklmnop|";
char*str;
char*v[100],*tt;
inti,j,recs,flds,err_code,c,rd_l,wr_l;
doublepay;
//declarestructureandvars.
MYSQLmysql;
MYSQL_RES*result;
MYSQL_ROWrow;
if(argc!
=1)service=argv[1];
else{//2
fprintf(stderr,"NOserviceassigned!
\nUsage:
\n");
fprintf(stderr,"\t%sserver_name!
\n",argv[0]);
fprintf(stderr,"Note:
svr_nameisdefinedinfile/etc/services\n");
exit(-1);
}//2
sprintf(cmd,"touch%s",log);system(cmd);
for(i=0;i<100;i++)v[i]=NULL;
1.数据库的初始化和套接字的运用
//initializeMYSQLstructure
if(mysql_init(&mysql)==NULL){//2
fprintf(stderr,"Errorinmysql_init!
\n");
exit(-1);
}//2
//connecttoDB
if(!
mysql_real_connect(&mysql,"localhost","root",0,"sp",0,NULL,0)){//2
fprintf(stderr,"Errorinconnection:
%s[%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql);
err_code=-2;
gotomysql_err;
}//2
if((sp=getservbyname(service,"tcp"))==NULL){//2
fprintf(stderr,"Error:
getservbyname");
exit(-5);
}//2
if((s=socket(AF_INET,SOCK_STREAM,0))==-1){//2
fprintf(stderr,"Error:
socketcreate");
exit(-6);
}//2
bzero(&sin,sizeof(sin));
sin.sin_port=sp->s_port;
if(bind(s,&sin,sizeof(s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网上 购物 系统 项目 开发 总结报告