软件工程系课程设计报告2P聊天系统.docx
- 文档编号:16921037
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:26
- 大小:202.06KB
软件工程系课程设计报告2P聊天系统.docx
《软件工程系课程设计报告2P聊天系统.docx》由会员分享,可在线阅读,更多相关《软件工程系课程设计报告2P聊天系统.docx(26页珍藏版)》请在冰点文库上搜索。
软件工程系课程设计报告2P聊天系统
1前言
1.1即时消息系统的研究现状
即时消息系统[1](InstantMessenger,IM)是一种在后PC时代兴起的,以Internet网络为基础的,允许交互双方即时地传送文字、语音、视频等信息,能够跟踪网络用户在线状态的网络应用软件。
即时消息系统产生有着深刻的社会原因:
人们都有渴望社交,获得社会尊重、实现自我的需求,这正是即时消息软件风行的原动力,而物质文明的日益发达所带来副作用,又使得人们习惯与周围的人保持距离,以致人们更愿意对陌生人敞开心扉,在网络中可以跨越年龄、身份、行业、地域的限制,达到人与人、人与信息之间的零距离交流。
从这点上讲,即时消息系统的出现改变了人们的沟通方式和交友文化,大大拓展了个人生活交流的空间。
1.2本工程的主要内容
本工程主要是设计完成一基于P2P的聊天系统,本系统主要包括客户端和服务器端两部分,实现类似于QQ的功能。
包括用户注册、在线朋友的获取、点对点的聊天等功能。
而本项目类容主要是使用VC++实现其中的点对点聊天功能。
2需求分析
此次开发的网络聊天工具可作为个人的交流工具使用。
本聊天需包含如下基本功能:
2.1功能分析
客户端:
(1)发送消息;
(2)接收消息;
(3)消息记录;
服务端:
(1)对客户端发来的消息处理并发送给另一客户端;
(2)将消息类容计入数据库;
(3)对客户请求作出应答并处理。
2.2方案分析
本项目仅供点对点聊天模块进行方案分析。
本系统实现用户点对点聊天,通过一客户端向服务器发送消息,服务器接受消息后将消息信息(消息内容和消息时间)记录到数据库,然后将其发送给另一用户,实现聊天功能,并可以向服务器发送请求查询消息记录。
3概要设计
聊天主要包括两方面内容:
服务器端和客户端。
1
2.2.1服务器端功能主要包括:
建立连接、接收用户数据、操作数据库。
(1)建立连接:
系统启动时建立一个连接,不断侦听是否有客户端连接或许断开。
(2)监听客户请求:
服务器端是一个信息的枢纽,所有客户端的信息都要传到服务器端,再由服务器根据要求分发出去,客户端在向服务器发送各种请求。
(3)数据库操作:
当客户机向服务器发送请求时,服务器需要通过数据库管理软件对数据库的数据进行增、删和查询。
(4)发送系统消息:
在客户端管理界面上,可以输入消息,并发送给所有的在线用户。
2.2.2客户端主要功能:
发送消息,接收消息,查询消息记录。
(1)客户端在与好友端建立通信连接后,便可以与好友进行聊天,聊天时发送的是文本信息,好友端在接收到聊天消息后,会提示收到消息,并由好友端自主打开消息接收界面。
(2)所有的聊天消息都会被保存起来,可以查看与每个好友的聊天记录。
聊天记录包括内容和时间。
3.1数据结构
此系统数据库中储存信息采用字符指针储存,将用户的信息用字符的形式进行处理并储存。
3.2逻辑结构与物理结构
(1)逻辑结构:
用户向服务器发送请求,服务器获取对方IP,若获取成功,用户向其发送消息,服务器将其处理并将其记录,然后将消息发给另一用户。
其E—R图如下所示:
2
将E-R图转化为关系模型,建立关系模型为:
消息(内容,时间);
记录信息(内容,储存信息);
服务器(服务器IP);
(2)物理结构:
在关系数据库中,确定数据库的物理结构主要指确定数据库的储存位置和储存结构,包括确定关系索引、日志、备份等数据的储存分配和储存结构,并确定系统配置等。
建立好的数据库物理结构可以提高系统执行速率,使得在数据库上运行的各种事务响应时间小、储存空间利用率高、事务吞吐率大。
还要充分了解所用RDBMS的内部特征,特别是系统提供的存取方法忽然储存结构。
a.所引法:
对常需要查询的数据建立索引;b.聚簇法:
为了提高某个属性(或属性组)的查询速度,把这个或这些属性上具有相同值的元组集中存放在连续的物理块中;c.hash法:
如果一个关系的属性大小可预知,而且不变或关系的大小变动,而且数据库管理系统提供了动态hash存取方法则可以使用hash存取方法。
评价物理数据库的方法完全依赖于所选用的DBMS,主要是从定量估算各种方案的储存空间、存取时间和维护代价入手,对估算结果进行权衡、比较,选择一个较为优化的合理方案设计物理结构。
3
3.3功能模块划分
3.3.1结构框图
3.3.2程序流图
(1)整个系统流程图如下:
4
3.3.3模块功能分析及外部设计
模块功能分析:
(1)发送消息:
用户选择好友,如果好友在线,服务器便获取其IP地址,用户打开消息盒编辑需要发送的消息,然后发送,服务器接受此消息,并处理记录到记录表中,然后将其发送给好友。
(2)接收消息:
好友发送的信息通过服务器处理并发送到本用户,如果设置为接收消息,则系统提示并可以打开查看此消息,否则服务器不将此消息发送到本用户。
(3)消息记录查询:
用户向服务器发送查询请求,服务器作出响应并将最近消息记录发送到此用户。
外部设计:
交互设计是面向最终用户的设计,是软件的外部设计,交互设计要求在研究软
5
件技术问题的同时对人加以研究。
用户是什么样的人?
用户怎样与新的计算机系统进行交互?
用户怎样解释系统产生的信息?
用户对系统有哪些期望?
这些问题仅仅是需要在用户交互设计时必须询问和回答的问题。
作为点对点的聊天系统,作为服务使用者得用户和提供服务的聊天系统有着互动和交换信息的过程,用户有请求,系统就必须有应答,需要双方参与。
(1)当用户选择好友向其发送消息时,点击好友,向服务器发送请求,如果好友在线,服务器自动获取好友IP并建立双方的连接,进行聊天。
否则应该提示好友不在,不能聊天或发送离线信息。
(2)用户查询聊天信息时,向服务器发送查询请求,服务器作出响应并将相应记录发送到此用户界面。
通过对产品的界面和行为进行交互设计,让产品和它的使用者之间建立一种有机关系,从而可以有效的达到使用者的目标,而好的交互设计会使系统和使用者之间更好的交互,达到“愉悦地合作”,这是交互设计的最终目的。
3.4抽象数据类定义
此系统主要定义3个抽象数据类型:
(1)消息(messages);(2记录(notes);
4详细设计
4.1数据类型定义
此系统主要定义3个抽象数据类型:
消息(messages);记录(notes);设置信息。
(1)消息(messages):
ADTmessages{
数据对象:
D={发送的信息U1..Un,|U1..Un∈CHAR}
数据关系:
R={
基本操作:
Receivemessages(&T,InetAddress,t)
操作结果:
将端口为InetAddress的信息包t的内容传给T,用T返回。
6
Sendmessages(t,InetAddress)
操作结果:
将信息包发送到端口InetAddress;
}ADTmessages
(2)记录(notes):
ADTnotes{
数据对象:
D={记录表中的信息U1..Un,|U1..Un∈CHAR}
数据关系:
R={
基本操作:
Checknotes(&T,InetAddress,t)
操作结果:
将信息记录表中的信息发送到端口InetAddress,并用T返回。
Deletenotes(&t,i)
操作结果:
如果i=1,将信息记录表中的信息删除。
Memorynotes(&t,InetAddress,T)
操作结果:
将端口InetAddress发来的信息包T的内容记录到消息记录表中。
}ADTnotes
4.2主要模块内部设计
此点对点聊天系统主要包括以下模块:
(1)发送消息;
(2)接收消息;(3)查询消息记录。
每个模块的主要执行功能函数及算法如下。
4.2.1模块1设计
4.2.1.1模块算法
模块一:
发送消息:
发送消息函数:
sendmessages(char*p,InetAdrress);
发送消息后自动执行储存函数:
memorymessages(InetAdrress,char*p);
4.2.1.2流程图
7
4.2.2模块2设计
4.2.2.1模块算法
模块二:
接收消息:
接收消息消息函数:
*receivemessages(InetAdrress,char*p);
接收消息后自动执行储存消息函数:
memorymessages(InetAdrress,char*p);
4.2.2.2流程图:
8
4.2.3模块3设计
4.2.3.1模块算法
模块三:
消息记录查询:
执行发送请求函数:
*checknotes(InetAdrress,char*p);
删除记录函数:
deletenotes(InetAdrress);
自动执行接收消息函数:
*receivemessages(InetAdrress,char*p);
4.2.3.2
流程图:
9
5实现与调试分析
5.1实现环境
硬件:
本系统选择在windows操作系统上实现,使用于windows操作之间的用户。
软件:
VC++平台;
5.2语言选择
本系统采用C++实现。
5.3调试分析
首先应该明确的是本系统的目的是什么。
调试是在程序运行成功后进行的排除错误过程。
常用的调试方法有回溯法、蛮干法和原因排除法。
本系统采用回溯法和
10
原因排除法比较合适。
本系统中每个模块实现一个功能,当主函数调用这些函数时,就会从接口输入一些信息,如果程序算法正确,则预期可以得到结果,通过功能函数的处理,应该输出处理结果,和预期结果比较,如果不能实现预期的功能,则说明程序中存在隐藏的问题。
当选择好友聊天时,如果输入聊天信息,,如果好友在线,则好友可以收到此消息,而且在服务器的记录表中应该记录此消息的相关记录,当用户发送查询请求时可以返回其聊天记录。
当发生错误时,那一功能不能实现,就去从新审查实现此功能函数的代码,注意实现功能的关键代码部分,为什么不能得到预期的结果。
不管采用什么办法,调试的任务就是找到此系统错误的原因并改正。
6测试分析
在实现本系统的同时每设计一个模块,就实现模块测试,使其能实现该函数需要实现的功能,此阶段为白盒测试。
此阶段将此模块作为单独的一个实体来测试,而且比较容易实际检验模块正确性的测试方案,保证每个模块单元的正确运行,来确定编码和详细设计的错误。
然后集成测试。
集成测试阶段,先将单元测试成功的模块放在一起形成一个子系统来测试,以解决模块间的协调和通信问题。
然后将子系统测试通过的模块放在一起形成一个完整的系统测试,检验功能,来发现需求报告中的错误。
6.1测试用例
为了检验此系统的正确性,设计了以下的一些测试用例:
(1)发送消息
选择好友输入信息:
“你好!
”
然后选择“查询消息记录”
(2)接收消息
好友发来消息选择接收。
然后恢复消息:
“你好!
”
然后选择“查询消息记录”
11
(3)查询消息记录
选择“查询消息记录”
通过以上此时用例,看此系统能否实现其聊天功能。
当发送消息时,检测好友端是否输出“你好!
”,当点击“查询消息记录”时,检测用户端是否有“你好!
”输出。
不同的测试数据发现程序错误的能力差别很大,为了提高测试效率低测试成本,应该选择高效的测试用例,数据尽量少,做到尽可能完备的测试就可以了。
6.2测试结果
此系统测试结果如下列图:
(1)发送消息测试结果如下:
12
(2)返回选择另一好友聊天测试如下:
(3)退出重复好友聊天测试结果:
(4)查询消息记录测试结果:
6.3性能分析
13
下面从时间性能和空间性能分析此系统:
(1)时间性能:
本系统采用文件保存方式对用户的信息进行保存并处理,方便了信息的网络拷贝,传输和下载,缩短了系统对用户请求的响应时间,而且,文件保存方便了文件打包压缩处理,为系统处理,传输节约时间。
(2)空间性能:
本系统在用户输入数据时采用数据缓冲区,解决了高速运行的CPU工作分配,解放CPU,大大提高了系统的运行速度。
7用户手册
此系统的用户手册包括:
此系统的功能,安装文档,使用手册。
(1)系统功能:
此系统的功能为实现用户的聊天信息交互。
并能对聊天记录进行查询。
(2)安装手册:
在使用此系统之前需要对此系统的安装,通过VC++平台将代码输入,然后编译,连接,运行,出现应用控制台进行聊天。
需要说明的是在编译之前需要设置服务器的IP设置,将代码中的服务器IP地址输入正确后才可以连接到服务器进行聊天。
(3)使用手册:
当进入聊天界面后,选择在线好友,选择聊天,输入信息,然后选择发送,服务器将信息储存后送给好友,等待好友回复信息。
当好友回复后,用户可以继续聊天。
当需要查询消息记录时,选择“消息记录查询”,将在界面显示聊天信息。
当聊天结束时,选择“下线”,用户可以断开与服务器的连接,实现下线功能。
总结
软件开发过程是一个复杂的过程,这就要求将其分成若干个阶段,若干个部分。
把此系统划分为若干个阶段,每个阶段的任务独立,而且比较简单,便于管理,从而降低了软件开发的难道,在每个阶段采用科学的管理技术和良好的技术方法,而且在每个阶段结束之前都从技术和管理两个角度进行严格的审查,合格后才进行下一步的工作,这就使开发工程的全过程以一种有条不紊的方式进行,保证了系统的质量,提高了系统的可维护性。
总之采用生命周期方法学可以大大提高此系统的开发成功率。
其次,维护占软件投资的很大比例,所以在开发时应该提高系统的可维护性。
14
参考文献
[1]张海藩.软件工程导论,清华大学出版社,2004
[2]陈明.实用软件工程基础,清华大学出版社,2003
[3]殷人昆.实用软件工程,清华大学出版社,2003
[4]宋波.UML面向对象技术与实践,科学出版社,2004
#include
#include
#include
voidchat();
voidcheckmessage();
voidmenu();
voidmain()
{intk;
menu();
while(k!
=3)
{cin>>k;
switch(k)
{case1:
chat();menu();break;
case2:
checkmessage();menu
();break;}
}
}
voidchat()
{intm;
char*p;
p=newchar[200];
ofstreamfile1;
file1.open
("D:
\\file1.txt",ios:
:
ate);
ofstreamfile2;
file2.open
("D:
\\file2.txt",ios:
:
ate);
ofstreamfile3;
file3.open
("D:
\\file3.txt",ios:
:
ate);
while(m!
=4){
cout<<"请选择好友:
"< cout<<"1.张明"< cout<<"2.王林"< cout<<"3.李强"< cout<<"4.返回"< cin>>m; switch(m) { case1: { cout<<"请输入消息: \n"; cout<<"李林: "; charv[]="李林: "; cin>>p; cout<<"张明: 你好! 你 叫什么名字? "< charq[]="张明: 你好! 你叫什么名字? "; //file1.seekp (0,ios: : end); file1.write(v,strlen (v)); file1.write(p,strlen (p)); file1.write(q,strlen (q)); cout<<"李林: "; cin>>p; cout<<"张明: 我叫张明 ,在四川大学读书! 今年20岁,你 呢? "< chars[]="张明: 我叫 张明,在四川大学读书,今年20岁,你呢? "; file1.write(v,strlen (v)); file1.write(p,strlen (p)); file1.write(s,strlen (s)); cout<<"李林: "; cin>>p; cout<<"张明: 好,再见 ! "< chart[]="张明: 好,再见! "; file1.write(v,strlen (v)); file1.write(p,strlen (p)); file1.write(t,strlen (t));file1.close();} break; case2: {cout<<"请输入消息: \n"; cout<<"李林: "; charv[]="李林: "; cin>>p; cout<<"王林: 你好! 你 叫什么名字! "< charq[]="王林: 你好! 你叫什么名字! "; //file2.seekp (0,ios: : end); file2.write(v,strlen (v)); file2.write(p,strlen (p)); file2.write(q,strlen (q)); cout<<"李林: "; cin>>p; cout<<"王林: 我叫王林 ,在北京大学读书! 今年21岁,你呢! "< chars[]="王林: 我叫 王林,在北京大学读书,今年21岁,你呢! "; file2.write(v,strlen (v)); file2.write(p,strlen (p)); file2.write(s,strlen (s)); cout<<"李林: "; cin>>p; cout<<"王林: 好,拜拜 ! "< chart[]="王林: 好,拜拜! "; file2.write(v,strlen (v)); file2.write(p,strlen (p)); file2.write(t,strlen (t));file2.close();}break; case3: { cout<<"请输入消息: \n"; cout<<"李林: "; charv[]="李林: "; cin>>p; cout<<"李强: 你好! 你 叫什么名字! "< charq[]="李强: 你好! 你叫什么名字? "; //file3.seekp (0,ios: : end); file3.write(v,strlen (v)); file3.write(p,strlen (p)); file3.write(q,strlen (q)); cout<<"李林: "; cin>>p; cout<<"李强: 我叫李强 ,在上海大学读书! 今年22岁,你呢? "< chars[]="李强: 我叫 李强,在上海大学读书,今年22岁,你呢? "; file3.write(v,strlen (v)); file3.write(p,strlen (p)); file3.write(s,strlen (s)); cout<<"李林: "; cin>>p; cout<<"李强: 好,拜拜 ! "< chart[]="李强: 好,拜拜! "; file3.write(v,strlen (v)); file3.write(p,strlen (p)); file3.write(t,strlen (t));file3.close();}break; //case4: break; } } file1.close(); file2.close(); file3.close(); } voidcheckmessage() {intt; charstr[1000]=""; ifstreamfile1("D: \\file1.txt"); ifstreamfile2("D: \\file2.txt"); ifstreamfile3("D: \\file3.txt"); while(t! =4){ cout<<"\n请输入要查询和哪位好友 的消息记录: \n"; cout<<"1.张明"< cout<<"2.王林"< cout<<"3.李强"< cout<<"4.返回"< cin>>t; switch(t) {case1: file1.read(str,1000); cout< case2: file2.read(str,1000); cout< case3: file3.read(str,1000); cout< }} file1.close(); file2.close(); file3.close(); } voidmenu(){ cout<<" **********************"< cout<<" **********************"< cout<<" ***欢迎进入聊天系统***"< cout<<" **********************"< cout<<" ***1.聊天***"< cout<<" ***2.消息记录查询***"< cout<<" ***3.下线***"< cout<<" **********************"< cout<<" **********************"< cout<<" **********************"< cout<<" 请选择你想要的操作"< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 工程系 课程设计 报告 聊天 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)