一.前言
在Linux环境下,使用GNU C或GNU C++,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。本次设计运用c语言为基础编程,同时联系数据库的使用和有关unix_socket的使用,但这部分类容对我们来说是相当生疏的,以前没有正式的学过。先在老师的引导下学了解了基本类容。我们做的是购物系统根据设计的要求必须要在完成通信功能的基础上,完成自己设计所要完成的功能。整个设计的中心类容就是要在运用数据库的基础上完成客户端和服务器的通信,所以我们一组的人先运用c语言完成对基本的程序要求,然后再根据所要完成的功能重用的数据库的类容创建数据库可所要的表。
设计过程中由于用到好多套接字的内容,好多函数的运用都很生疏,我们一组的人在一起商量外,还大量利用网络资源,尤其是在运用一些数据库的函数进行编程的时候更是进度很慢,在写程序的过程中还得像这怎么把数据库的内容在运行是能起上作用,总之整个过程并不是像刚开始时想的那么简单。
目录
这次设计整个过程我们在都在院机房,从8月25开始的设计,第一天我们先进行总体大的框架的构想,想出有关购物系统所要完成的功能,在对所要写的程序进行整体的划分,总基础整个过程所要设计学过的和要运用的刚了解的东西,大的思路出来以后再对组中的成员进行工作分工,前两天我们所完成的主要的工作就是了解并能掌握在进程之间的通信,这是整个设计最基础的东西,也是最最重要的地方。然后解下来的时间就是对程序的构思和写就,因为在写程序的过程中要用到数据库的类容,所以在程序写出一部分以后在今测试的都要建立相应的数据库。测试和调试出来很多的问题,在老师和同学的帮助下最后都解决了。
二、设计目的和要求
1、设计目的
这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型的软件。本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。
本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件—中间件,尤其掌握这种设计的思想和方法。
在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。这里有政策的因素,有制度的要求,也有技术的成份。
设计理念:设计一个项目,学会一个方法,做好一项工程。
2、设计要求
1)纪律要求
(1)严格遵循软件实习的有关安排,按时完成设计任务。
(2)严格遵守学校的纪律和机房的各项管理规定。
(3)严格请假制度,需请假时,必须经指导老师批准。
2)技术要求
按软件工程的思想和方法来设计这一项目,并把它作为一个工程来做。设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。
因不是针对某个具体业务系统的,该系统的设计只是一个大的框架,但要求对实际系统进行模拟,能针对实际系统更好。建议模拟移动公司的手机代收费系统。要求本设计的三部分都要对所接收和发送的数据以文件形式留迹并同时在屏幕上显示。客户端要求对接收到的返回数据进行正确格式的显示或打印。服务器端要先建立模拟用数据文件或数据库,这是服务的基础。
服务器数据库要求使用Linux提供的免费的MySQL。开发时主要用到C访问MySql的接口程序MySql C API。
该设计的三个部分都要设计出程序,并要在验收时进行演示。
3)具体要求
(1)客户端
客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,定义在/etc/services中,比如mysvr1 5678),另一个是目的主机(定义在/etc/hosts内,也可使用DNS来解析),缺省时为本机。
客户至少要实现如下功能:用户管理;查询;交易(交费,购物等);撤销;统计。
(2)中间件
中间件程序命名为middleware,要带有三个参数,一个是服务器的服务(名字,与客户端同),第二个作为请求的服务(自己定义,定义在/etc/services中,要区别于客户端,比如mysvr2 5679),第三个为目的主机(定义在/etc/hosts内),缺省时为本机。
中间件要完成与客户要求相符的功能:是本地的本地处理,否则发往服务器方。具体地是:接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方。
(3)服务器
服务器程序可命名为server,要求带有一个服务参数,与中间件的mysvr2同。
服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。
(4)留迹或log
留迹或log工作在客户端、中间件和服务器三方都要做,以供统计或核对使用。客户端或中间件方可以使用文本文件或数据库,但在服务器方张须使用MySql数据
三.流程图如下
2.商品搜索流程图
3.用户登录流程图
4.购物流程图
四.客户端的功能实现部分及源代码
? 客户端是打开一通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求,等待并接收应答;请求结束后关闭通信通道。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操作系统,使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 tbl;drop database db/ table tbl;select … from tbl … where …insert … into tbl … values … update … tbl … set … where …delete … from tbl … where …
因为我们要完成的事网上购物系统,所以客户端组要是完成查询可购买的功能,所以所用的到数据库也相对的简单。
客户端部分源代码
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <mysql/mysql.h>
#define rec_length 20
main(int argc,char **argv)
{
struct hostent *hp;
struct sockaddr_in sin;
struct servent *sp;
char c;
char buff[1000],cmd[500],spname[13],spnum[6];
int s,err_code,recs,flds,i,rd_l,wr_l;
int op;
char *service,*dest,*log="clt.log";
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
1.运用unix_socket的内容完成服务器与客户端的基本定义:
if(argc!=1){ service=argv[1]; dest=argv[2];}
else {
fprintf(stderr,"NO service assigned!\nUsage:");
fprintf(stderr,"%s service_name destination!\n",argv[0]);
fprintf(stderr,"Note: service_name is defined in /etc/services\n");
fprintf(stderr," destination is defined in /etc/hosts\n");
exit(-1);
}
sprintf(cmd,"touch %s",log);system(cmd);
err_code=0;
if(mysql_init(&mysql)==NULL){ //2
fprintf(stderr,"Error in mysql_init!\n");
exit(-1);
} //2
2.把服务器与客户端通过说句库连接起来,并完成基本的通信功能。
//connect to DB
if(!mysql_real_connect(&mysql,"localhost","root",0,"clt",0,NULL,0)){ //2
fprintf(stderr,"Error in connection: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql);
err_code=-2;
goto mysql_err;
} //2
// query();
sprintf(cmd,"SELECT * FROM main");
//execute query
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
} //5
//get result
if((result=mysql_store_result(&mysql))==NULL){ //5
fprintf(stderr,"Error in store_result: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
// mysql_close(&mysql);
err_code=-4;
goto mysql_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,"No Data in Table UNIT");
goto mysql_err2;
}
//process result set
bzero(buff,500);
printf("\ninput the name of goods:");
scanf("%s",spname); spname[13]='\0';
row=mysql_fetch_row(result);
getdate(cmd);
// getdate Date + 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,"UPDATE main set curr_jnl=\'%d\' where unit_id=\'%s\'",i,row[0]);
//fprintf(stderr,"%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_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);
}
// next 2 Line build request message
if((wr_l=write(s,buff,strlen(buff)))!=strlen(buff)){ //to server
fprintf(stderr,"Write Socket s ERROR\n!");
close(s); exit(-1);
}
if((rd_l=read(s,cmd,500))==0){ //get replay from server
fprintf(stderr,"Read Socket s Error\n");
close(s); exit(-2);
}
close(s);
printf("%s\tsend: %s\n\tget reply:(%d Bs) %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 %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 input your option:1:query 2:buy 3:print 4:quit(q/Q)\n");
scanf("%d",&op);
if(op==4) exit(0);
if(op==2){
printf(" \n number:");
scanf("%s",spnum);spnum[6]='\0';
}
sprintf(buff,"%1.1d|%s|%s|%8.8s%4.4s|%5.5d|%4.4s|",op,spname,spnu m,cmd,row[0],atoi(row[1]),row[0]);
printf("\n===%s===\n",buff); //
goto leb_send;
}
exit(0);
}
getdate(char *d)
{int i;time_t t,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);
d[8]='\0';
return 0;
}
3,服务器端的功能实现及源代码
服务器端所用到的函数与客服端的几乎是一样的,用到套接字的内容,和数据库的东西,但是其中的数据库要相对复杂。他可以接收来自客服端的命令请求,并分析命令然通过数据库对客服端的请求给予答复。
服务器端的源代码为
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <mysql/mysql.h>
#define rec_length 20
void strsplit(char *,char **,char );
main(int argc, char **argv )
{ //1 main
struct sockaddr_in sin;
struct servent *sp;
int s,ns,pid;
char d='|',tmp[1000],buff[500],cmd[500];
char *service,*log="svr.log";
// char s[]="1234|567|7|90|abcd|efghijklmnop|";
char *str;
char *v[100],*tt;
int i,j,recs,flds,err_code,c,rd_l,wr_l;
double pay;
//declare structure and vars.
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
if(argc!=1) service=argv[1];
else { //2
fprintf(stderr,"NO service assigned!\nUsage:\n");
fprintf(stderr,"\t%s server_name!\n",argv[0]);
fprintf(stderr,"Note: svr_name is defined in file /etc/services\n");
exit(-1);
} //2
sprintf(cmd,"touch %s",log);system(cmd);
for(i=0;i<100;i++) v[i]=NULL;
1.数据库的初始化和套接字的运用
// initialize MYSQL structure
if(mysql_init(&mysql)==NULL){ //2
fprintf(stderr,"Error in mysql_init!\n");
exit(-1);
} //2
//connect to DB
if(!mysql_real_connect(&mysql,"localhost","root",0,"sp",0,NULL,0)){ //2
fprintf(stderr,"Error in connection: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_close(&mysql);
err_code=-2;
goto mysql_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: socket create");
exit(-6);
} //2
bzero(&sin,sizeof(sin));
sin.sin_port=sp->s_port;
if(bind(s,&sin,sizeof(sin))==-1){ //2
fprintf(stderr,"Error: bind");
close(s); exit(-6);
} //2
if(listen(s,5)==-1){ //2
fprintf(stderr,"Error: listen");
close(s); exit(-6);
} //2
while(1){ //2 while
fprintf(stderr,"\n\t\t\t Now wait connect ...\n");
if((ns=accept(s,0,0))==-1){ // wait a connection //3
fprintf(stderr,"error: accept"); continue;
}//3
err_code=0;
2. 进程的使用,创建子进程来处理客户机所发来的信息:
if((pid=fork())==-1){ //conneted, and then create child proc//3
fprintf(stderr,"server: fork error!");
close(s); exit(-1);
}//3
if(pid!=0){//parent proce,nothing to do, and to the next loop//3
close(ns);
wait(0);
continue;
}//3
if(pid==0){ // entered child proccedure //3 pid=0
close(s);
printf("Receive a client connect:%s\n",argv[1]);
if((rd_l=read(ns,buff,500))==0){ //4
fprintf(stderr,"Read nothing from socket:ns\n");
close(ns); exit(-3);
} //4
printf("%s get message from ns: %s\n",argv[0],buff);
buff[rd_l]='\0';strcpy(tmp,buff);strcat(tmp,"|OKOK|");rd_l+=4;
3. 运用unix_Socket实现所要完成的功能
strsplit(buff,v,d);
switch(v[0][0]) { //4 switch
case '1':
// query();
sprintf(cmd,"SELECT * FROM sp WHERE spname=\'%s\'",v[1]);
//execute query
printf("\nCMD=%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
} //5
//get result
if((result=mysql_store_result(&mysql))==NULL){ //5
fprintf(stderr,"Error in store_result: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
// mysql_close(&mysql);
err_code=-4;
goto mysql_err;
} //5
mysql_err:
sprintf(buff,"%2.2d|",err_code);
if(err_code!=0) goto mysql_err1;
recs=mysql_num_rows(result);
flds=mysql_num_fields(result);
for(i=0;i<recs;i++){ //5
//process result set
if(recs==0) sprintf(cmd,"00|");
else
sprintf(cmd,"%2.2d|",recs);
strcat(buff,cmd);
row=mysql_fetch_row(result);
// pay=atof(v[2])+atof(row[2]);
// printf("%f",&row[2]);
// printf("\n");
for(j=0;j<flds;j++){ //6
sprintf(cmd,"%s|",row[j]);
strcat(buff,cmd);
}
}//6
printf("\nBUFF form DB=%s\n",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\'",v[2],v[1]);
//execute query
printf("\nCMD=%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
}
// sprintf(tt,);
sprintf(cmd,"UPDATE payment SET transtime=\'%s\'where sp_id=\'%s\'", v[3], v[1]);
//execute query
printf("\nCMD=%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
}
/* sprintf(cmd,"UPDATE main SET curr_jn1=\'%d\'where unit_id=\'%s\'", v[5],v[6]);
//execute query
printf("\nCMD=%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
}
*/
/*sprintf(cmd,"SELECT * FROM main");
//execute query
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
} //5
//get result
if((result=mysql_store_result(&mysql))==NULL){ //5
fprintf(stderr,"Error in store_result: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
// mysql_close(&mysql);
err_code=-4;
goto mysql_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,"No Data in Table UNIT");
goto mysql_err2;
}
k=atoi(row[3]) + 1;
sprintf(cmd,"UPDATE main set curr_jnl=\'%d\' where unit_id=\'%s\'",i,row[0]);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
} //5
//get result
if((result=mysql_store_result(&mysql))==NULL){ //5
fprintf(stderr,"Error in store_result: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
// mysql_close(&mysql);
err_code=-4;
goto mysql_err;
*/ sprintf(cmd,"SELECT * FROM sp WHERE spname=\'%s\'",v[1]);
//execute query
printf("\nCMD=%s\n",cmd);
if(mysql_query(&mysql,cmd)!=0){ //5
fprintf(stderr,"Error in query: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
// mysql_close(&mysql);
err_code=-3;
goto mysql_err;
} //5
//get result
if((result=mysql_store_result(&mysql))==NULL){ //5
fprintf(stderr,"Error in store_result: %s [%d]\n",\
mysql_error(&mysql),mysql_errno(&mysql));
mysql_free_result(result);
// mysql_close(&mysql);
err_code=-4;
goto mysql_err;
} //5
sprintf(buff,"%2.2d|",err_code);
recs=mysql_num_rows(result);
flds=mysql_num_fields(result);
//process result set
sprintf(cmd,"%2.2d|",recs);
strcat(buff,cmd);
row=mysql_fetch_row(result);
// pay=atof(v[2])+atof(row[2]);
// printf("%f",&row[2]);
// printf("\n");
for(j=0;j<flds;j++){ //6
sprintf(cmd,"%s|",row[j]);
strcat(buff,cmd);
} //6
printf("\nBUFF form DB=%s\n",buff);
mysql_free_result(result);
//nothing(buff);
break;
case '3':
// print();
nothing(buff);
break;
default:
fprintf(stderr,"Func. code error in:\n%s",buff);
} //4 switch
wr_l=strlen(buff);
if((wr_l=write(ns,buff,wr_l))!=wr_l){ //4
fprintf(stderr,"Write socket ns error!\n");
close(ns); exit(-4);
} //4
strncat(tmp,buff,wr_l);wr_l+=rd_l;
buff[wr_l]='\n';++wr_l;
if((flds=open(log,O_WRONLY|O_APPEND))==-1){
fprintf(stderr,"File %s open error!\n",log);
exit(-5);
}
if(write(flds,tmp,wr_l)!=wr_l){
fprintf(stderr,"File %s write error!\n",log);
close(flds);exit(-6);
}
close(flds);
close(ns); exit(0);
} //3 switch
} //2 while
} //1 main
void strsplit(char *s,char **v,char d)
{
int i,j,l;
j=0;v[j]=s;
l=strlen(s);
for(i=0;i<l;i++){
if(*(s+i)!='|') continue;
else {
*(s+i)='\0';
v[++j]=s+i+1;
// printf("=%d\t",j);
}
}
// for(i=0;v[i]!=NULL;i++) fprintf(stderr,"%d:%s\n",i,v[i]);
}
nothing(char *x)
{
sprintf(x,"00|");』
五,程序测试与调试过程中出现的问题及解决方法
刚开始进行设计的前两天,主要是掌握基本的通信犯法和步骤,这一部分内容都是以前学的内容,接下来就是程序的编写部分,开始的时候只是运用c语言的内容进行编写,运行的时候出的只是简单的语法或语义的错误,但是当想到把数据库运用到程序中时遇到很多问题,数据库的如何导入,怎杨把数据库和程序融合在一起共同起作用,刚开始不清楚这部分内容的时候,在编译链接是总是出现段错误,最后问老师以后才知道是没有创建数据库的原因。创建数据库的时候由于没有彻底搞清楚数据的使用,在创建的时候没有注意到没有注意到各表之间的连接运行的时候还是有错误。然后数据库的创立问题解决以后,程序中又出了问题,在数据库与unix_socket的融合使用的时,在进程的通信过程中由于函数还没有理解清楚参量部分不能很好的定义。然后我们一组又在一起套弄让后在同学的帮助下解决了问题。
六.设计成果如下
七.心得体会
心得体会
在我们集体的共同努力下还是把课程设计给完成了,可以说是大快人心,但过程是很曲折和艰难的。
在此之前,我们已做过好几次课程设计,虽说在这方面我们每个人都应有一些经验,但我们这次却要做的是网络编程,对每个人来说都是一个新的课题,所以大家心里都没底,且都有难色。
刚开始大家都不知怎么做,但在老师的指引和同学们相互交流下,经大家一点一点努力下,最终突破了一个一个的困难,两周的努力终于见到了胜利的果实。
现在我们已是大四的学生了,我们在一起做课程设计,协同合作的机会已不多了,实践证明,我们把握住了这种不多的机会,我们学到了许多东西。我们组不仅出色的完成老师交给我们的任务,也再一次的巩固了我们的基础,还从课外书和网络中学到了许多我们不会和不知道的东西,这极大的增加,拓展了我们的知识视野。
在这近半个月的大家协同生活中,我看到了我们集体中每一个人所付出的努力和辛苦,也让我体会到团队精神得难能可贵,集体力量的强大。这都是我学到的,我想会不久,我们迈出校门时会体会到这些知识和能力的价值的。
我对克隆人技术的看法吴剑20xx年x月x日我许久以前看到小说,内容大概是说人类掌握了克隆技术,可以实行大量工厂化的人类生产和繁殖过…
工合同段程项目总结建设有限公司20xx年8月S333JASS1标质量报告一工程概况本合同段起止桩号K0000K134633主要施工…
企业费用管理项目开发工作总结计科1101班11150041李媛媛同时随着现代工业的发展计算机信息管理系统越来越受到企业重视本文主要…
特殊工业用竹新品种选育及快繁育苗新产品新技术开发工作总结报告承担单位陈其兵合作单位长宁县曙光观赏竹园艺场二0一三年十二月一项目来源…
大学生软件开发实习总结时间过得真快,转眼间,在山大实习生活就结束了四周的时间能够和山大的同学一起工作、学习、生活我感到非常的荣幸,…
大学生软件开发实习总结时间过得真快,转眼间,在山大实习生活就结束了四周的时间能够和山大的同学一起工作、学习、生活我感到非常的荣幸,…
项目开发总结报告1.引言1.1编写目的阐明编写本系统试运行计划书的目的,指出读者对象。1.2项目背景列出本项目的委托单位、开发单位…
十、项目开发总结报告1.引言...................................................…
分类:模板项目编号:S×××-项目名称项目开发总结报告Version:项目承担部门:撰写人(签名):完成日期:本文档使用部门:■主…
10、项目开发总结10.1引言10.1.1编写目的银行ATM自动取款机系统的开发已经基本完成。写此项目开发总结报告,以方便我们在以…
密级:内部公开文档编号:ChinaOly-系统名称-开发总结报告版本号:V1.0XXX系统开发总结报告杭州中奥科技有限公司修订记录…