网络电子词典实习报告记录.docx
- 文档编号:26954951
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:19
- 大小:80.47KB
网络电子词典实习报告记录.docx
《网络电子词典实习报告记录.docx》由会员分享,可在线阅读,更多相关《网络电子词典实习报告记录.docx(19页珍藏版)》请在冰豆网上搜索。
网络电子词典实习报告记录
网络电子词典实习报告记录
————————————————————————————————作者:
————————————————————————————————日期:
大学计算机学院毕业实习成绩鉴定表
姓名
班级
学号
实习时间
学生实际实习内容:
在本次实训中,我们学习到了很多的知识,包括shell编程、文件IO、
Linux网络编程、sqlite数据库等众多的知识点。
最后以项目网络电子词典贯穿整个知识点,把我们所学的内容都应用起来。
达到了活学活用的效果。
出勤情况
迟到
次
早退
次
旷工
天
病假
天
事假
天
全勤
天
实习单位鉴定意见:
单位(盖章):
年月日
指导教师评定实习报告成绩:
签名:
年月日
评阅教师评定实习成绩:
签名:
年月日
计算机科学与技术学院
2011级学生毕业实习报告
专业:
班级:
姓名:
指导教师:
实习单位:
实习时间:
网络电子词典项目
编写时间:
作者:
版本:
v-1.0.0
一、实验目的
1.1引言
二十世界后半叶,伴随着社会的迅速发展与进步,以电子计算机为代表的现代科学技术获得了突飞猛进的发展并迅速和人们的日常生活结合在一起。
计算机技术的发展和进步也使电子词典的诞生变得可能。
虽然只有十来年的历史,电子词典却已经迅速发展壮大,成为词典家族中具有生命力的一员。
本系统是一个网络电子词典,主要功能是为用户提供一个能实现查询用户注册,用户登陆和查询单词机查询历史记录等功能。
本文从项目的角度进行了简单的描述。
该系统是基于Linux系统下里利用了网络的基本知识,及sqlite数据库的相关知识。
1.2背景
任何一种词语,使用频率高了,就会成为公共词汇。
英语作为一种国际通用
性语言,部分单词已成为公共词汇,并且直接应用到汉语中来。
因其表达简洁,
准确而受到人们青睐。
但是,这些新引入或者比较专业词汇,对于较少关注新闻,
接触网络的群体而言,就会造成阅读困难。
传统的纸质英汉词典因为更新周期久,
携带不便,价格相对昂贵而不能广泛应用。
方便,高效,快捷的电子词典才能满
足现代人的需要。
1.3参考资料
名称
作者
出版社
Unix网络编程
W.RichardStevensBillFenner
AndrewM.Rudoff
TCP/IP协议详解
Gary.Wrigh W.RichardStevens
机械工业出版社
Unix高级环境编程
WilliamRichardStevens
人民邮电出版社
二、系统概述
我们的这套系统采用的是tcp协议的并发服务器设计,可以满足多用户同时登录,用户登录后可以查询单词及历史记录,对于数据的存储我们采用的是sql数据库技术,查找快速,保密性好!
>具体功能能如下:
<1>主界面
(1)用户登录
(2)用户注册
(3)用户退出
<2>登陆成功后界面
(1)查询单词
(2)查询历史
(3)退出
三、拓扑结构如下
4、详细设计
4.1消息类型设计
宏名设计
说明
USER_REGISTER
用户注册
USER_LOGIN
用户登陆
USER_WORD
用户查询单词
USER_SUCCESS
操作成功
UNAME_ERROR
无此用户
PASSWD_ERROR
密码错误
USER_FAILURE
操作失败
4.2结构体的设计
注:
__attribute__((__packed__))表示取消结构体对齐
typedefstruct
{
char_username[25];//用户名
char_word[25];//密码
}__attribute__((__packed__))user_t;
typedefstruct
{
inttyped;
intsize;
union
{
user_tuinfo;//用户信息
char_word[100];
}
//客户端填词,服务端填写单词解释
#definewordcontent._word
#defineusernamecontent.uinfo._username
#definepasswordcontent.uinfo._passwd
}__attribute__((__packed__))mhead_t;
#defineEXEC_SQL(db,sql,errmsg)do{\
if(sqlite3_exec(db,sql,NULL,NULL,&merrmsg)<0)\
{\
fprintf(stderr,“sqliteexec[%s]error:
%s\n”,sql,errmsg);\
exit(EXIT_FAILURE);
}\
}while(0);
4.3数据库设计
表名
字段
user_table
NAME
PASSWORD
dict_table
word
explain
4.4部分核心代码
1)服务器端
登陆处理函数
intdo_login(intsockfd,sqlite3*pdb,char*_username,char*_password)
{
char*errmsg;
charbuf[1024];
char**dbresult;
intnrow,ncolumn;
charsql[1024]={0};
mhead_t*head=(mhead_t*)buf;
//constchar*sql="select*fromuser_tablewhereNAME='%s'andPASSWORD='%s'";
sprintf(sql,"select*fromuser_tablewhereNAME='%s'andPASSWORD='%s';",_username,_password);
if(sqlite3_get_table(pdb,sql,&dbresult,&nrow,&ncolumn,&errmsg)!
=SQLITE_OK)
{
fprintf(stderr,"sqlite3gettableerror:
%s.\n",errmsg);
exit(EXIT_FAILURE);
}
if(nrow<1)
{
bzero(sql,sizeof(sql));
//sprintf(sql,"insertintouser_tablevalues('%s','%s');",_username,_password);
//EXEC_SQL(pdb,sql,errmsg);
//rc=sqlite3_open(sql,&db);
//if(rc!
=SQLITE_OK){
//fprintf(stderr,"Can'topendatabase:
%s\n",sqlite3_errmsg(db));
head->type=USER_FAILURE;
if(send(sockfd,buf,sizeof(mhead_t),0)<0)
{
perror("Failtosend");
exit(EXIT_FAILURE);
}
printf("?
?
?
?
?
?
?
?
?
?
\n");
}else{
head->type=USER_LOGIN;
if(send(sockfd,buf,sizeof(mhead_t),0)<0)
{
perror("Failtosend");
exit(EXIT_FAILURE);
}
//printf("?
?
?
?
?
?
?
\n");
}
sqlite3_free_table(dbresult);
return0;
}
单词查询函数
intdo_query(intsockfd,sqlite3*pdb,char*_word)
{
char*errmsg;
chardanci[1024];
char**dbresult;
intnrow,ncolumn;
charsql[1024]={0};
mhead_t*head=(mhead_t*)danci;
inti=0,j=0;
sprintf(sql,"select*fromdict_tablewhereword='%s';",_word);
if(sqlite3_get_table(pdb,sql,&dbresult,&nrow,&ncolumn,&errmsg)!
=SQLITE_OK)
{
fprintf(stderr,"sqlite3gettableerror:
%s\n",errmsg);
exit(EXIT_FAILURE);
}
intindex=ncolumn;
for(i=0;i { for(j=0;j { printf("%d: %s\t",index,dbresult[index]); index++; } } //printf("nrow: %d\n",nrow); sprintf(head->word,"%s",dbresult[3]); printf("result: %s\n",head->word); if(nrow==0) { bzero(sql,sizeof(sql)); if(send(sockfd,danci,sizeof(mhead_t),0)<0) { perror("Failtosend"); exit(EXIT_FAILURE); } printf("没有查处此单词"); } else{ if(send(sockfd,danci,sizeof(mhead_t),0)<0) { perror("Failtosend"); exit(EXIT_FAILURE); } } sqlite3_free_table(dbresult); return0; } 绑定套接字,连接IP端口 intinit_tcp(char*ip,char*port) { intsockfd; structsockaddr_inserver_addr; if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) { perror("Failtosocket"); exit(EXIT_FAILURE); } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(atoi(port)); server_addr.sin_addr.s_addr=inet_addr(ip); if(bind(sockfd,(structsockaddr*)&server_addr,sizeof(server_addr))<0) { perror("Failtobind"); exit(EXIT_FAILURE); } listen(sockfd,5); printf("listen....\n"); returnsockfd; } 2)客户端 登陆请求函数 intdo_login(intsockfd) { intn=0; intcount=0; charbuf[1024]={0}; mhead_t*head=(mhead_t*)buf; printf("\n登陆,请输入用户名和密码\n"); head->type=USER_LOGIN; head->size=sizeof(mhead_t); printf("Inputusername: "); fgets(head->username,sizeof(head->username),stdin); head->username[strlen(head->username)-1]='\0'; printf("Inputpassword: "); fgets(head->password,sizeof(head->password),stdin); head->password[strlen(head->password)-1]='\0'; if(send(sockfd,buf,sizeof(mhead_t),0)<0) { perror("Failtosend"); exit(EXIT_FAILURE); } bzero(&buf,sizeof(buf)); while (1) { n=recv(sockfd,buf+count,sizeof(mhead_t)-count,0); if(n<=0){ perror("Failtosend"); exit(EXIT_FAILURE); } //若是数据未发送完成,再次接收的时候可补充 count+=n; if(count==sizeof(mhead_t)) break; } if(head->type==USER_LOGIN) { printf("\n恭喜您,登陆成功! \n"); return0; }else{ printf("\n很遗憾,登录失败,请重新登陆\n"); //printf("\n"); return-1; } return0; } 单词查询函数 intdo_query(intsockfd) {intn=0,count=0; charbuf[1024]; //charyisi[1024]; FILE*fp; inti=0; printf("\n请输入你要查询的单词>"); mhead_t*head=(mhead_t*)buf; fp=fopen("log.txt","a+"); if(fp==NULL) { fprintf(stderr,"Failtoopen: %s\n",strerror(errno)); exit(EXIT_FAILURE); } intline=get_line(fp); time_tt;//可能需要加头文件 structtm*ptm; t=time(NULL); ptm=localtime(&t); //printf("%s\n",head->word); //fprintf(fp,"%d,%s\n",++line,head->word); head->type=USER_WORD; head->size=sizeof(mhead_t); fgets(head->word,sizeof(head->word),stdin); head->word[strlen(head->word)-1]='\0'; fprintf(fp,"%d,%s: ",++line,head->word); if(send(sockfd,buf,sizeof(mhead_t),0)<0) { perror("Failtosend"); exit(EXIT_FAILURE); } bzero(buf,sizeof(buf)); n=recv(sockfd,buf,sizeof(mhead_t),0); if(n<0){ perror("Failtosend"); exit(EXIT_FAILURE); } fprintf(fp,"%s,%d-%d-%d%d: %d: %d.\n",head->word,ptm->tm_year+1900,ptm->tm_mon,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec); fflush(fp); fclose(fp); //printf("len: %d\n",strlen(buf)); printf("单词的意思是: "); printf("%s\n",head->word); do_word(sockfd); return0; } 记录查询函数 intdo_history(intsockfd) { intn=0,count=0; charjilu[1024]; FILE*fp; mhead_t*head=(mhead_t*)jilu; head->type=USER_WORD; head->type=sizeof(mhead_t); head->word[strlen(head->word)-1]='\0'; printf("历史记录为: \n"); fp=fopen("log.txt","a+"); if(fp==NULL) { perror("Failtoread"); exit(EXIT_FAILURE); } //system("clear"); while(fgets(jilu,sizeof(jilu),fp)! =NULL) { printf("%s\n",jilu); } fclose(fp); //printf("%s\n",head->word); do_word(sockfd); return0; } 五、心得体会 通过这次实习,我对计算机专业在行业实践中面临问题及解决办法有了一个较为全面的认识。 巩固专业知识的同时也增加了责任感,实习的日子里也加深了同学友谊,锻炼了团队精神。 大学生活让我对计算机理论知识有了一定的了解,但真正操作起来就没有那么容易。 纸上得来终觉浅,绝知此事要躬行。 经过过去三周的实习,我对自己有了新的认识及前进的方向。 在信息时代,学习是不断地汲取新信息,获得事业进步的动力。 现在通过实习总感觉自己学的不够,要用到知识时总感觉脑袋是空白的。 为了能更好的适应工作,只能自己去努力学习。 尽量空闲时间多看书、多实践,希望能弥补不足,但也不能失去自信。 对给自己点信心,多给自己点赞赏,多给自己鼓鼓劲。 相信总会走出一条宽敞大道的。 实习中,基于Linux的网络编程,老师将Linux基本命令交给我们,让我们熟悉Linux下的操作。 初期,对与Windows下不同,大量命令式操作,让我很不适应,但熟悉后,感觉很有意思。 后来到进程、消息等,顿时觉得对系统的运行有了更深的了解。 接着,学习关于通过本次试验使我了解了在linux环境下www,dns,ftp,dhcp等服务器的构建,以及它们的工作原理。 学会了如何通过命令方式对www,dns,ftp,dhcp等服务器进行配置,对一些配置文件得到了了解,例如: etc/dns的配置文件named.conf,www服务器的配置文件usr/local/apache2/conf/httpd.conf ,ftp的配置文件etc/vsftpd/conf/vsftpd.conf.,dhcp的配置文件etc/dhcpd.conf.。 2. 在配置dns服务器时老是实现不了,检查named.conf文件时并未查出语法方面的错误,检查var/,var/1.168.192文件时也没发现语法或是配置错误,在httpd.conf文件中也进行了servername的配置。 怎么就不行呢? 百思不得其解,最后XX了一下,原来是resolv.conf文件中没有配servername,再加上servername 后就可以使用了。 使我意识到在配命令的时候一定要注意先后顺序以及细节问题,只有这样开有可能保证万无一失。 3. Apache的配置文件在阅读的时候需要细心,里面有许多东西虽然这次试验用不 到,但我们亦应该了解它的含义以及它的用处。 4. 在配置dhcp服务器是,用另一台电脑查看dhcp服务器配置是否正确时,输入 ipconfig时,电脑的网卡并没有使用linux下的dhcp服务器,检查配置文件没有错误,最后发现是虚拟机的网卡没有连接,连接好网卡后在另一台电脑就可以访问到linux的dhcp服务器了。 实习,是开端也是结束。 在书本上学过很多理论,但从未付诸实践过,也许等到真正运用时,才会体会到难度有多大。 在今后的工作和生活中,自己需要更加努力的奋斗下去。 实习也让我了解到了自己的不足,我会继续努力,完善自我。 对于学校的精心安排和指导老师的用心辅导非常感谢。 按照老师的安排,我制定了相应的实习计划。 注重在实习阶段对所学知识的巩固和提高,以期达到根据理论知识,指导日常的工作实践的目的。 收到了较好的效果。 在做实验前,我以为不会难做,就像以前做物理实验一样,做完实验,然后两下子就将实验报告做完.直到做完测试实验时,我才知道其实并不容易做,但学到的知识与难度成正比,使我受益匪浅. 在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间.比如做光伏的实验,你要清楚光伏的各种接法,如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半.做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做.做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛. 通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅. 这次的实验跟我们以前做的实验不同,因为我觉得这次我是真真正正的自己亲自去完成。 所以是我觉得这次实验最宝贵,最深刻的。 就是实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。 在这里我深深体会到哲学上理论对实践的指导作用: 弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。 我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。 实验总是与课本知识相关的。 在实验过程中,我们应该尽量减少操作的盲目性提高实验效率的保证,有的人一开始就赶着做,结果却越做越忙,主要就是这个原因。 我也曾
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 电子词典 实习 报告 记录