还剩21页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Harbin Instituteof Technologyat Weihai瞟程双计报告部程名称:藻程设计VC++院系:计算机科学与技术系段计题聊天室程序设计班级____________________________________役计者______________________________学号_________________________指导教师____________________________设计时间20n.
8.25——哈尔滨工业大学(鼠海)〃定义一个*类型的变量作用就在此chatDlg-GetMessage;CMyChatDlg chatDlg体现」//收到服务器告知的更新用户的消息iftype==LOGIN〃调用类中的方法chatDlg-UpdateUser;CMyChatDlg UpdateUserCSocket::OnReceivenErrorCode;第三个函数〃更新用户列表void CMyChatDlg::UpdateUser{char buff[lOOO];memsetbuff,0,sizeofbuff;m_pSocket-Receivebuff,sizeofbuff,0;CString user_info=buff;存放用户名称CString array
[100];//int b=0;〃拆分服务器端发来的用户名称,并用for inti=0;iuser_info.GetLength;i++ARRAY数组来存储〃判断是否已经到达的尾端ifi!=user_info.GetLength-1UER_INFO,〃判断是否已经到一个昵称的结尾ifuser_info[i]==〃用户力口一b++;}else〃将一个用户名称拷贝到一个数组单元array[b]=array[b]+user_info[i];中m_num.Formatn%d,\b+l;〃将INT类型的b转换为CString类型〃变量至控件UpdateDataFALSE;IJ〃置空列表框m_UserList.ResetContent;forint j=0;jb+1;j++;〃将转换好的用户名称依次显示出来m_UserList.AddStringarraym}第四个函数响应发送按钮的函数void CMyChatDlg::OnSend//;//控件的值一变量UpdateDataifm_strMessage==不能发送空消息!!!”;AfxMessageBox〃得到该控件类型的对CEdit*pEdit=CEdit*GetDlgItemIDC_EDIT_MESSAGE;象地址〃调用成员函数设置焦点pEdit-SetFocus;return;Header head;head.type=SEND_MESSAGE;head.len=m_strMessage.GetLength;〃得到系统当前时间CTime time=CTime::GetCurrentTime;〃设置时间格式CString t=time.Format,%H:%M:%S”;二CString nikeNametheApp.m__strName;CString str=nikeName+”n+t+\r\n+m_strMessage;〃把要发送的信息者B存储在这str变量中〃发送头信息”m_pSocket-Sendchar*head,sizeofHeader;//TODO:Add yourcontrol notificationhandler codehere//发送用户编辑的信息,并判断ifm_pSocket-SendLPCTSTRstr,str.GetLength Send函数的返回值m_strMessage=nn;变量一控件的值UpdateDataFALSE;//CEdit*pEdit=CEdit*GetDlgItemIDC_EDIT_MESSAGE;pEdit-SetFocus;else网络传输错误!;AfxMessageBox第五个函数对象中的方法调用BOOL CMyChatDlg::GetMessage//^CClientSocket OnReceive{〃定义一个数组来接受消息char buff
[1000];〃将数组全部初始化为memsetbuff,0,sizeofbuff;0〃接受消息m_pSocket-Receivebuff,sizeofbuff,0;二CString strTempbuff;strTemp+=_Tn\r\nn;〃用变量中的内容替换消息显示框控件的m_MessageList.ReplaceSelstrTemp;strTemp当前区域return TRUE;>运行结果与分析(测试)打开服务器并初始化一个用户登陆服务器客户端发送了▼X一条消息笊Q聊天信息1人在线唐皴13:05:47老在线用户:师好第二个用户登唐毅陆丁发送退出//ChatServer,K——__L_r2人在线2人在线服务器初始化成功…在绷户唐唐殿13:05:472011-09-0713:05:30:唐毅进入聊天室毅烟灰缸老师好在线用户唐毅13:05:47烟灰缸13:07:34唐毅烟灰缸老师好呵2011-09-0713:07:17:烟灰缸进入聊天室烟灰缸13:07:34呵呵次*6聊天信息2人在线烟灰缸13:07:34呵呵在线用户:唐毅烟灰缸发送退出两个用户之间聊天昵称为唐毅的用户离开聊天室0人在线服务器初始化成功…2011-09-0713:05:30:唐毅进入聊天室唐毅13:05:47老师好2011-09-0713:07:17:烟灰缸进入聊天室烟灰缸13:07:34呵呵2011-09-0713:07:51:唐毅离开聊天室2011-09-0713:08:06:烟灰缸离开聊天室关闭月艮岩器昵称为烟灰缸的用户离开聊天室>总结(收获与体会)>附源代码注以下代码包括了一点VC自动帮我们生成的部分客户端源代码CMyChatApp类中的Initlnstance方法BOOL CMyChatApp::Initlnstance()〃初始化实例if!AfxSocketInit〃初始化WINSOCK环境,一旦选择支持WINSOCKET类则由MFC为我们自动生成AfxMessageBox IDP_SOCKETS_INIT_FAILED;return FALSE;AfxEnableControlContainer;//Standard initialization//If youare notusing thesefeatures andwish toreduce thesize//of yourfinalexecutable,you shouldremove fromthe following//the specificinitializationroutines youdo notneed.AFXDLLEnable3dControls;//Call thiswhen usingMFC ina sharedDLL#elseEnable3dControlsStatic;//Call thiswhen linkingto MFCstaticallyttendifCClientSocket*clientSocket;clientSocket=new CClientSocket;//NEW一个CClientSocket对象,用来之后与服务器端建立连接CLoginDlg*loginDlg;loginDlg=new CLoginDlgclientSocket;〃NEW一个CLoginDlg对象if loginDlg-DoModal==IDCANCEL//显示这个登陆窗口,并判断返回值是否来IDCANCEL,如是{delete clientSocket;delete loginDlg;〃则delete这两个对象return false;//返回false后程序结束elsedelete loginDlg;〃如果用户点击的是登陆按钮,则会调用对应的消息处理函数,并delete这个登陆窗口对象CMyChatDlg*dlg;dig=new CMyChatDlgclientSocket;m_pMainWnd=dlg;//m_pMainWnd是CWinThread是CMyApp的基类的一个成员变量,用于储存一个指向我们创建的一个线程的主窗口的对象int nResponse=dig-DoModal;〃显示客户端主窗口,并接受函数的返回值return FALSE;在CMyChatApp类中的成员变量CString mstrName;定义了一个结构体typedef structtagHeader char type;int len;}Header,*pHeader;ftdefine L0GIN_I01ttdefine SEND_MESSAGE3客户端套接字类中的OnReceive成员函数void CClientSocket::OnReceiveint nErrorCode//TODO:Add yourspecialized codehere and/or callthe baseclass charbuff[sizeofHeader];memsetbuff,0,sizeofbuff;Receive buff,sizeofbuff;Header header=Header*buff;〃这里需要一个类型的转换int length=header-len;char type=header-type;if type==SEND_MESSAGE chatDlg-GetMessage;〃定义一个CMyChatDlg*类型的chatDlg变量作用哈尔滨工业大学(威海)计算机学院《课程设计》验收及成绩评定表(项目组)VC++班号项目名称聊天室程序设计1004104职责学号姓名主要分工组长服务器端100410424成员100410407客户端成员服务器端100410409成员100410421客户端指导教师设计地点设计开始日期项目完成日期文档评审成绩(共分)35评审项目评审内容成绩标准评审成绩文档格式是否规范;文字是否规范;图文档格式分10表是否规范;术语是否准确文档质量程序设计思想与整体框架是否清晰分20文档一致性文档与程序是否一致分5文档总体评价总成绩界面友好和美观性评价(共分)10评审项目评审内容成绩标准评审成绩实现方法图形界面或命令行界面,美观程度5分实现语言面向过程或面向对象5分界面总体评价总成绩程序功能完备性评审成绩(共分)40评审项目评审内容成绩标准评审成绩程序是否能正常运行;是否出现死锁;程序运行状况分10是否遇到错误而中止运行对于给定的输入数据,是否能得到正确程序正确性分15的输出结果程序与文档的程序与各种文档的内容是否一致分5一致性程序的代码量程序代码量的大小分10程序总体评价总成绩就在此体现if type==LOGIN」〃收到服务器告知的更新用户的消息、{chatDlg-UpdateUser;〃调用CMyChatDlg类中的UpdateUser方法CSocket::OnReceive nErrorCode;在这个类中还定义了两个公有的成员变量CMyChatDlg*chatDlg;〃用来调用主窗口中的GetMessage和UpdateUser方法CString n_strName;〃存放该客户端的昵称登陆窗口类的构造函数CLoginDlg::CLoginDlgCClientSocket*p Socket,CWnd*pParent/*=NULL*/〃创建它的对象的时候需要传递它一个CClientSocket对象:CDialog CLoginDlg::IDD,pParent〃的地址,用来建立连接ASSERTp_Socket;〃断言assert是一个宏,一般可以用在判断某件操作是否成功上mpSocket=p_Socket;〃提取传递进来的参数//{{AFX_DATA_INITCLoginDlgmstrName=_T〃〃;m_strServer=_T
127.
0.
0.1;〃_T是一个宏,这里的作用相当于初始化了这两个控件的值//}AFX_DATA_INIT登陆窗口的确定按钮响应函数void CLoginDlg::0n0K//TODO:Add extravalidation hereUpdateData;〃用来刷新数据的,如果参数为真,则刷新控件的值到对应的变量,若为假,则方向相反//m_pSocket-m_strName=this-m_strName;if!m_pSocket-Create〃创建AfxMessageBox〃网络创建错误!!!〃;m_pSocket-Close;return;if!m_pSocket-Connect m_strServer,9999〃连接,参数分别为服务器IP和端口号AfxMessageBox〃连接服务器失败!!!〃;m_pSocket-Close;return;Header head;head,type=LOGIN IO;head,len=m strName.GetLengthO;m pSocket-Sendchar*head,sizeof Header;〃向服务器端发送预备消息,告知消息类型,准备好接受数据m_pSocket-Send m_strName,m_strName.GetLength;〃发送该客户端的用户昵称theApp.m_strName=m_strNanie;〃如果不加此行,用户的昵称将无法显示到聊天窗口CDialog::OnOK;〃调用基类的ONOK函数,MFC自动调用的登陆窗口类中的成员变量有CClientSocket*m_pSocket;CString m_strName;CString m_strServer;重载了一个CMyChatDlg类的构造函数CMyChatDlg::CMyChatDlgCC1ientSocket*p_Socket,CWnd*pParent/*=NULL*/〃需要传递已经和服务器建立连接的CClientSocket对象:CDialogCMyChatDlg::IDD,pParentCClientSocket始终是一个主线,整个流程都要用到它,因此必需传递它mpSocket=p_Socket;〃提取传递的参数m_pSocket-chatDlg=this;〃将本窗口的对象地址赋值给m_pSocket中的成员变量chatDlgo//{{AFX_DATA_INIT CMyChatDlgm_strMessage=_T〃〃;//初始化控件值m num=_T〃〃;//}}AFX_DATA_INIT//Note thatLoadicon doesnot requirea subsequentDestroylcon inWin32m_hlcon=AfxGetApp-LoadIconIDR_MAINFRAME;〃读取图标DoDataExchange函数,完成了控件与变量的关联前几个类中也有该函数voidCMyChatDlg::DoDataExchangeCDataExchange*pDX CDialog::DoDataExchangepDX;//{{AFX_DATA_MAPCMyChatDlgDDX_ControlpDX,IDC_LIST_USER,m_UserList;DDX ControlpDX,IDC EDITLIST,m MessageList;DDX Text pDX,IDC_EDIT MESSAGE,m strMessage;DDX_TextpDX,IDC_STATIC_NUM,m_num;//}}AFX_DATA_MAP消息映射宏EGIN_MESSAGE_MAPCMyChatDlg,CDialog//{{AFX_MSG_MAPCMyChatDlgON_WM_SYSCOMMANDON_WM_PAINTON_WM_QUERYDRAGICONON_BN_CLICKEDID_SEND,OnSend//}}AFX_MSG_MAPEND_MESSAGE_MAPCMyChatDlg类中的OnSend方法void CMyChatDlg::OnSend〃响应发送按钮的函数UpdateDataO;〃控件的值一变量ifm_strMessage==〃〃{AfxMessageBox〃不能发送空消息!!!〃;CEdit*pEdit=CEdit*GetDlgItemIDC_EDIT_MESSAGE;//得到该控件类型的对象地址pEdit-SetFocus;〃调用成员函数设置焦点return;Header head;head,type=SEND_MESSAGE;head,len=m_strMessage.GetLengthO;CTime time=CTime::GetCurrentTime;〃得到系统当前时间CString t=time.Format%H:%M:%S〃;〃设置时间格式CString nikeName=theApp.m_strName;CString str=nikeName+〃〃+t+〃\r\n〃+m_strMessage;〃把要发送的信息都存储在这str变量中m_pSocket-Sendchar*head,sizeof Header;〃发送“头信息”//TODO:Add yourcontrol notificationhandler codehereif mpSocket-Send LPCTSTRstr,str.GetLength〃发送用户编辑的信息,并判断Send函数的返回值{m_strMessage=〃〃;UpdateData FALSE;〃变量一控件的值CEdit*pEdit=CEdit*GetDlgltemIDC_EDIT_MESSAGE;pEdit-SetFocus;else{AfxMessageBox网络传输错误!”;CMyChatDlg类中的OnCancel方法void CMyChatDlg::OnCancel//响应退出键//TODO:Add extracleanup hereifm_pSocket{m_pSocket-Close;〃关闭连接delete m_pSocket;CDialog::OnCancel;CMyChatDlg类中的GetMessage方法BOOL CMyChatDlg::GetMessage〃由CClientSocket对象中的OnReceive方法调用char buff
[1000];〃定义一个数组来接受消息memset buff,0,sizeof buff;〃将数组全部初始化为0m_pSocket-Receive buff,sizeof buff,0;//接受消息CString strTemp=buff;strTemp+=_T〃\r\n〃;m_MessageList.ReplaceSel strTemp;〃用strTemp变量中的内容替换消息显示框控件的当前区域return TRUE;}CMyChatDlg类中的UpdateUser方法oid CMyChatDlg::UpdateUserchar buff
[1000];memsetbuff,0,sizeofbuff;m_pSocket-Receivebuff,sizeof buff,0;CString user_info=buff;CString array
[100];〃存放用户名称int b=0;for inti=0;iuser_info.GetLengthO;i++〃拆分服务器端发来的用户名称,并用ARRAY数组来存储{if i!=user_info.GetLengthO-1//判断是否已经到达UER INFO的尾端{ifuser_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;jb+l;j++{m_UserList.AddStringarray[j];〃将转换好的用户名称依次显示出来以上就是客户端的源代码哈尔滨工业大学(威海)计算机学院《课程设计》验收及成绩评定表(项目组)VC++实现技术难易程度(共分)15评审项目评审内容成绩标准评审成绩难易性评价采用的关键技术,实现方法分5实用性评价采用的方法是否适合分5程序实现语采用何种语言实现分5总体评价总成绩项目综合评价项目组总成绩评审日期年月日评审人签字备注姓名学号院(系)计算机与软件学院专业计算机科学与技术系任务起止日期年月日至年月日2011825201197课程设计题目聊天室程序设计问题阐述与分析随着网络的普及,网络聊天已经可以轻易实现并且因为其诸多优点,网络聊天甚至成为人们生活中不可缺少的必要环节当然,聊天不可能只局限于亲人之间,往往也会和陌生人聊天,讨论感兴趣的话题聊天室就是这样一种工具,更适合于陌生人聊天,抑或朋友们局域网内谈话聊天室程序设计主要需要解决2大问题,第一是用户、服务器端的界面设计;第二则是实现网络内的连接和通信,服务器端的消息转发等这里,我们通过VC++MFC完成了我们聊天室系统工作量首先,需分析系统,化为多个功能单位,以便分工合作以及后期维护、修改其次程序需在环境下实现面向连接的通信过程,需要客户端和服务端两部TCP/IP分服务器端需有支持,并要与本地端口绑定,并实现监听若有客户端连接请socket求,则将客户端地址分配给一个空实现登录服务器聊天socket客户端需要可以与建立连接,并通过这个实现发送和接收数据socket socket最后做操作界面和各功能键的美化工作,和最后的程序测试工作工作计划安排:同组设计者及分工同组共有四人
1.负责用户端的初始化、外部功能的实现包括主聊天窗口,用户列表更新等
2.负责用户端的初始化包括登录窗口,接发送信息等
3.负责服务器端的构造包括模块,绑定端口,监听用户端状态socket接受处理用户端请求等功能
4.负责服务器端的构造动态显示包括用户登录,状态刷新、课程设计报告VC++>软硬件运行环境Intel®Pentium®2及以上处理器,32M以上内存,4G以上硬盘Microsoft®Windows™XP操作系统及以上版本800*600或以上的屏幕分辨率>开发环境>Intel®CORE i5®
2.8GHz,2内存,320G硬盘Microsoft®Windows™XP ProfessionalMicrosoft®Visual C++
6.0>问题及难点所在要解决的问题如何与服务器端建立连接,如何接收服务器端发给客户端的消息,相应的处理这些消息还有就是如何提取出服务器端发给客户端的所有的客户昵称,然后更新客户端的用户列表最后是一些按钮的响应函数的编写>涉及算法的思想首先应该明白,Windows窗口应用程序是基于消息驱动的,这应该是贯穿整个过程的基本思想其次跟据MFC程序的体系结构,和大体框架,清楚自己写的代码应该加在哪些地方实际编程中善于将控件窗口与一个变量相联系,可以很大的简化操作特别要提到的是程序中更新用户列表的方法,与服务器端的算法刚好相反,充分利用FOR循环并用IF判断语句来提取信息系统的流程图注这个流程图是在另一个文档中画的,完成后复制过来发现尺寸不是很好,显示得很难看,所以采用了截图的方法,清晰度不是很高,望老师体谅系统的设计与分析第一个函数〃登陆窗口的登陆按钮响应函数void CLoginDlg::OnOK;//用来刷新数据的,如果参数为真,则刷新控件的值到对应的变量,若UpdateData为假,则方向相反//m_pSocket-m_strName=this-m_strName;〃创建if!m_pSocket-Create网络创建错误!!!”;AfxMessageBoxm_pSocket-Close;return;}连接,参数分别为服务器和端口号if!m_pSocket-Connectm_strServer,9999//IP连才妾服务器失贝攵!!!”;AfxMessageBoxm_pSocket-Close;return;Header head;head.type=LOGIN_IO;head.len=m_strName.GetLength;〃向服务器端发送预备消息,告知消m_pSocket-Sendchar*head,sizeofHeader;息类型,准备好接受数据发送该客户端的用户昵称m_pSocket-Sendm_strName,m_strName.GetLength;//〃如果不加此行,用户的昵称将无法显示到聊天窗theApp.m_strName=m_strName;口〃调用基类的函数,自动调用的CDialog::OnOK;ONOK MFC第二个函数处理服务器端发送的消息void CClientSocket::OnReceiveint nErrorCode//char buff[sizeofHeader];memsetbuff,0,sizeofbuff;Receivebuff,sizeofbuff;〃这里需要一个类型的转换Header*header=Header*buff;int length=header-len;chartype=header-type;iftype==SEND.MESSAGE。
个人认证
优秀文档
获得点赞 0