VC++课程设计报告Word下载.docx
- 文档编号:19511488
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:24
- 大小:475.79KB
VC++课程设计报告Word下载.docx
《VC++课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《VC++课程设计报告Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
文档评审成绩(共35分)
评审项目
评审内容
成绩标准
评审成绩
文档格式
文档格式是否规范;
文字是否规范;
图表是否规范;
术语是否准确
10分
文档质量
程序设计思想与整体框架是否清晰
20分
文档一致性
文档与程序是否一致
5分
文档总体评价
总成绩
界面友好和美观性评价(共10分)
评审内容
实现方法
图形界面或命令行界面,美观程度
5分
实现语言
面向过程或面向对象
界面总体评价
程序功能完备性评审成绩(共40分)
程序运行状况
程序是否能正常运行;
是否出现死锁;
是否遇到错误而中止运行
程序正确性
对于给定的输入数据,是否能得到正确的输出结果
15分
程序与文档的一致性
程序与各种文档的内容是否一致
程序的代码量
程序代码量的大小
程序总体评价
实现技术难易程度(共15分)
难易性评价
采用的关键技术,实现方法
实用性评价
采用的方法是否适合
程序实现语言
采用何种语言实现
总体评价
项目综合评价
项目组总成绩
评审日期
年月日
评审人签字
备注
哈尔滨工业大学(威海)课程设计任务书
姓名:
院(系):
计算机与软件学院专业:
计算机科学与技术系
任务起止日期:
2011年8月25日至2011年9月7日
课程设计题目:
问题阐述与分析:
随着网络的普及,网络聊天已经可以轻易实现。
并且因为其诸多优点,网络聊天甚至成为人们生活中不可缺少的必要环节。
当然,聊天不可能只局限于亲人之间,往往也会和陌生人聊天,讨论感兴趣的话题。
聊天室就是这样一种工具,更适合于陌生人聊天,抑或朋友们局域网内谈话。
聊天室程序设计主要需要解决2大问题,第一是用户、服务器端的界面设计;
第二则是实现网络内的连接和通信,服务器端的消息转发等。
这里,我们通过VC++MFC完成了我们聊天室系统。
工作量:
首先,需分析系统,化为多个功能单位,以便分工合作以及后期维护、修改。
其次程序需在TCP/IP环境下实现面向连接的通信过程,需要客户端和服务端两部分。
服务器端需有socket支持,并要与本地端口绑定,并实现监听。
若有客户端连接请求,则将客户端地址分配给一个空socket。
实现登录服务器聊天。
客户端需要可以与socket建立连接,并通过这个socket实现发送和接收数据。
最后做操作界面和各功能键的美化工作,和最后的程序测试工作。
工作计划安排:
同组设计者及分工:
同组共有四人。
1.负责:
用户端的初始化、外部功能的实现
包括主聊天窗口,用户列表更新等
2.负责:
用户端的初始化
包括登录窗口,接发送信息等
3.负责:
服务器端的构造
包括socket模块,绑定端口,监听用户端状态
接受处理用户端请求等功能
4.负责:
包括用户登录,状态刷新、动态显示。
Ø
软硬件运行环境:
Intel®
Pentium®
2及以上处理器,32M以上内存,4G以上硬盘
Microsoft®
Windows™XP操作系统及以上版本
800*600或以上的屏幕分辨率
开发环境:
Intel®
COREi5®
2.8GHz,2内存,320G硬盘
Windows™XPProfessional
VisualC++6.0
问题及难点所在
要解决的问题:
如何与服务器端建立连接,如何接收服务器端发给客户端的消息,相应的处理这些消息。
还有就是如何提取出服务器端发给客户端的所有的客户昵称,然后更新客户端的用户列表。
最后是一些按钮的响应函数的编写。
涉及算法的思想
首先应该明白,Windows窗口应用程序是基于消息驱动的,这应该是贯穿整个过程的基本思想。
其次跟据MFC程序的体系结构,和大体框架,清楚自己写的代码应该加在哪些地方。
实际编程中善于将控件窗口与一个变量相联系,可以很大的简化操作。
特别要提到的是程序中更新用户列表的方法,与服务器端的算法刚好相反,充分利用FOR循环并用IF判断语句来提取信息。
系统的流程图
注:
这个流程图是在另一个文档中画的,完成后复制过来发现尺寸不是很好,显示得很难看,所以采用了截图的方法,清晰度不是很高,望老师体谅。
系统的设计与分析
第一个函数:
voidCLoginDlg:
:
OnOK()//登陆窗口的登陆按钮响应函数。
{
UpdateData();
//用来刷新数据的,如果参数为真,则刷新控件的值到对应的变量,若为假,则方向相反。
//m_pSocket->
m_strName=this->
m_strName;
if(!
m_pSocket->
Create())//创建。
{
AfxMessageBox("
网络创建错误!
!
"
);
m_pSocket->
Close();
return;
}
Connect(m_strServer,9999))//连接,参数分别为服务器IP和端口号。
连接服务器失败!
Headerhead;
head.type=LOGIN_IO;
head.len=m_strName.GetLength();
m_pSocket->
Send((char*)&
head,sizeof(Header));
//向服务器端发送预备消息,告知消息类型,准备好接受数据。
Send(m_strName,m_strName.GetLength());
//发送该客户端的用户昵称。
theApp.m_strName=m_strName;
//如果不加此行,用户的昵称将无法显示到聊天窗口
CDialog:
OnOK();
//调用基类的ONOK函数,MFC自动调用的。
}
第二个函数:
voidCClientSocket:
OnReceive(intnErrorCode)//处理服务器端发送的消息
charbuff[sizeof(Header)];
memset(buff,0,sizeof(buff));
Receive(buff,sizeof(buff));
Header*header=(Header*)buff;
//这里需要一个类型的转换。
intlength=header->
len;
chartype=header->
type;
if(type==SEND_MESSAGE)
chatDlg->
GetMessage();
//定义一个CMyChatDlg*类型的chatDlg变量作用就在此体现。
if(type==LOGIN_IO)//收到服务器告知的更新用户的消息。
chatDlg->
UpdateUser();
//调用CMyChatDlg类中的UpdateUser方法。
CSocket:
OnReceive(nErrorCode);
第三个函数:
voidCMyChatDlg:
UpdateUser()//更新用户列表。
charbuff[1000];
Receive(buff,sizeof(buff),0);
CStringuser_info=buff;
CStringarray[100];
//存放用户名称
intb=0;
for(inti=0;
i<
user_info.GetLength();
i++)//拆分服务器端发来的用户名称,并用ARRAY数组来存储。
if(i!
=(user_info.GetLength()-1))//判断是否已经到达UER_INFO的尾端。
{
if(user_info[i]=='
&
'
)//判断是否已经到一个昵称的结尾。
{
b++;
//用户加一
}
else
array[b]=array[b]+user_info[i];
//将一个用户名称拷贝到一个数组单元中。
}
m_num.Format("
%d"
b+1);
//将INT类型的b转换为CString类型。
UpdateData(FALSE);
//变量到控件。
m_UserList.ResetContent();
//置空列表框。
for(intj=0;
j<
b+1;
j++)
m_UserList.AddString(array[j]);
//将转换好的用户名称依次显示出来。
第四个函数:
OnSend()//响应发送按钮的函数。
UpdateData();
//控件的值—>
变量
if(m_strMessage=="
)
不能发送空消息!
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);
//得到该控件类型的对象地址。
pEdit->
SetFocus();
//调用成员函数设置焦点。
head.type=SEND_MESSAGE;
head.len=m_strMessage.GetLength();
CTimetime=CTime:
GetCurrentTime();
//得到系统当前时间。
CStringt=time.Format("
%H:
%M:
%S"
//设置时间格式。
CStringnikeName=theApp.m_strName;
CStringstr=nikeName+"
"
+t+"
\r\n"
+m_strMessage;
//把要发送的信息都存储在这str变量中。
//发送“头信息”。
//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_pSocket->
Send((LPCTSTR)str,str.GetLength()))//发送用户编辑的信息,并判断Send函数的返回值。
m_strMessage="
;
UpdateData(FALSE);
//变量—>
控件的值
else
网络传输错误!
第五个函数:
BOOLCMyChatDlg:
GetMessage()//由CClientSocket对象中的OnReceive方法调用。
//定义一个数组来接受消息。
//将数组全部初始化为0。
//接受消息。
CStringstrTemp=buff;
strTemp+=_T("
m_MessageList.ReplaceSel(strTemp);
//用strTemp变量中的内容替换消息显示框控件的当前区域。
returnTRUE;
运行结果与分析(测试)
打开服务器并初始化
一个用户登陆服务器
客户端发送了一条消息
第二个用户登陆
两个用户之间聊天
昵称为唐毅的用户离开聊天室
昵称为烟灰缸的用户离开聊天室
总结(收获与体会)
附:
源代码
以下代码包括了一点VC自动帮我们生成的部分。
客户端源代码:
CMyChatApp类中的InitInstance方法:
BOOLCMyChatApp:
InitInstance()//初始化实例。
if(!
AfxSocketInit())//初始化WINSOCK环境,一旦选择支持WINSOCKET类则由MFC为我们自动生成。
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
returnFALSE;
AfxEnableControlContainer();
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();
//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic();
//CallthiswhenlinkingtoMFCstatically
#endif
CClientSocket*clientSocket;
clientSocket=newCClientSocket();
//NEW一个CClientSocket对象,用来之后与服务器端建立连接。
CLoginDlg*loginDlg;
loginDlg=newCLoginDlg(clientSocket);
//NEW一个CLoginDlg对象。
if(loginDlg->
DoModal()==IDCANCEL)//显示这个登陆窗口,并判断返回值是否来IDCANCEL,如是
deleteclientSocket;
deleteloginDlg;
//则delete这两个对象。
returnfalse;
//返回false后程序结束。
//如果用户点击的是登陆按钮,则会调用对应的消息处理函数,并delete这个登陆窗口对象。
CMyChatDlg*dlg;
dlg=newCMyChatDlg(clientSocket);
m_pMainWnd=dlg;
//m_pMainWnd是CWinThread(是CMyApp的基类)的一个成员变量,用于储存一个指向我们创建的一个线程的主窗口的对象。
intnResponse=dlg->
DoModal();
//显示客户端主窗口,并接受函数的返回值。
returnFALSE;
在CMyChatApp类中的成员变量:
CStringm_strName;
定义了一个结构体:
typedefstructtagHeader
chartype;
intlen;
}Header,*pHeader;
#defineLOGIN_IO1
#defineSEND_MESSAGE3
客户端套接字类中的OnReceive成员函数:
OnReceive(intnErrorCode)
Addyourspecializedcodehereand/orcallthebaseclass
在这个类中还定义了两个公有的成员变量:
CMyChatDlg*chatDlg;
//用来调用主窗口中的GetMessage和UpdateUser方法。
//存放该客户端的昵称。
登陆窗口类的构造函数:
CLoginDlg:
CLoginDlg(CClientSocket*p_Socket,CWnd*pParent/*=NULL*/)//创建它的对象的时候需要传递它一个CClientSocket对象
CDialog(CLoginDlg:
IDD,pParent)//的地址,用来建立连接。
ASSERT(p_Socket);
//断言assert是一个宏,一般可以用在判断某件操作是否成功上。
m_pSocket=p_Socket;
//提取传递进来的参数。
//{{AFX_DATA_INIT(CLoginDlg)
m_strName=_T("
m_strServer=_T("
127.0.0.1"
//_T是一个宏,这里的作用相当于初始化了这两个控件的值。
//}}AFX_DATA_INIT
登陆窗口的确定按钮响应函数:
OnOK()
Addextravalidationhere
登陆窗口类中的成员变量有:
CClientSocket*m_pSocket;
CStringm_strServer;
重载了一个CMyChatDlg类的构造函数:
CMyChatDlg:
CMyChatDlg(CClientSocket*p_Socket,CWnd*pParent/*=NULL*/)//需要传递已经和服务器建立连接的CClientSocket对象
:
CDialog(CMyChatDlg:
IDD,pParent)//CClientSocket始终是一个主线,整个流程都要用到它,因此必需传递它。
//提取传递的参数。
chatDlg=this;
//将本窗口的对象地址赋值给m_pSocket中的成员变量chatDlg。
//{{AFX_DATA_INIT(CMyChatDlg)
m_strMessage=_T("
//初始化控件值。
m_num=_T("
//Notethat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)