![vc++网络聊天室的实现计算机操作系统课程设计方案说明书含MFC源程序_第1页](http://file4.renrendoc.com/view/467a471fe3fbbcc011ce1f4979540667/467a471fe3fbbcc011ce1f49795406671.gif)
![vc++网络聊天室的实现计算机操作系统课程设计方案说明书含MFC源程序_第2页](http://file4.renrendoc.com/view/467a471fe3fbbcc011ce1f4979540667/467a471fe3fbbcc011ce1f49795406672.gif)
![vc++网络聊天室的实现计算机操作系统课程设计方案说明书含MFC源程序_第3页](http://file4.renrendoc.com/view/467a471fe3fbbcc011ce1f4979540667/467a471fe3fbbcc011ce1f49795406673.gif)
![vc++网络聊天室的实现计算机操作系统课程设计方案说明书含MFC源程序_第4页](http://file4.renrendoc.com/view/467a471fe3fbbcc011ce1f4979540667/467a471fe3fbbcc011ce1f49795406674.gif)
![vc++网络聊天室的实现计算机操作系统课程设计方案说明书含MFC源程序_第5页](http://file4.renrendoc.com/view/467a471fe3fbbcc011ce1f4979540667/467a471fe3fbbcc011ce1f49795406675.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE8实验报告||实验名称网络谈天室的实现课程名称计算机操作系统||目录设计原理————-——-—————-———-—-4程序流程图—-—————-—————-—-————-—9设计步骤—--———-————-——-———-————10使用方法说明——-——————————————--—-21实验结果及分析-——————-—--—-——-—-—-24ﻬ设计原理计算机网络技术进展至今已经大大超越了人们当时的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网.各种实时性的谈天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的便利,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时谈天工具。随着网络的日益普及,各种谈天工具也层出不穷,接下来的课程设计就是针对一个简洁的网络谈天程序,利用MFC为开发工具,实现基本的通讯功能。此程序主要分为两部分:服务器端和客户端。服务器端用于供应一个网络端口,等待客户端发出恳求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接恳求,然后登陆谈天室.在服务器端的成员列表栏中会显示在线的全部人名单,有人退出谈天室,成员列表会自动除名.服务器端同时也供应了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体使用了CSocket类的方法,实现了网络通讯谈天.整个程序设计为两个部分:服务器(ChatServer)和客户端(Chat)多人谈天的关键在于要将每个客户端发送过来的消息分发给全部其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存全部与客户端建立了连接的服务端口。下面描述了多人谈天的实现原理:当客户端ClientN向对应的服务端口N发送了消息Message,服务端口N将Message复制给全部套接口列表(USERLIST)中的套接口缓冲区,然后向每个服务端口发送WRITE消息,使每个服务端口将Message发送给对应的客户端。这样,全部客户端就都获得了Message消息,实现了多人谈天功能。BOOLCClientSocketList::Sends(char*buff,intn){CClientSocket*curr=Head; while(curr)ﻩ{curr->Send(buff,n);ﻩﻩcurr=curr-〉Next;}ﻩreturntrue;}USERLIST表时多人谈天程序的核心,它是一个动态变化的链表,为空表示没有客户端建立了连接,不为空时每个元素就代表有一个客户端与服务器建立了连接。以下程序是私聊功能的实现:BOOLCClientSocketList::OnlySend(char*buff,intn,intwho){ﻩCClientSocket*curr=Head;ﻩwhile(curr&&who〉0) {curr=curr->Next;ﻩﻩwho--;}ﻩcurr—>Send(buff,n); returntrue;}以下是此程序的效果截图:服务器端的效果截图ﻬ用户“yq”的登录界面用户“zxl”的登录界面
功能描述多人会话。此程序分为服务器端和客户端,当客户端要进入谈天室的时候,就必须通过网络连接到服务端,以实现和其它客户端的通讯功能.其中最简洁的一种通讯方式就是多人会话,运用多线程同时对多个用户的信息进行监听,服务器通过转发消息,让全部人都可以得到消息,实现多人会话。一对一会话。此程序的服务器端除了能够供应多人会话的功能外,还供应了私人谈天功能,可以实现一对一的谈天。就是在消息转发的时候,私聊的消息只发给私聊的对象,而其他人看不到此消息,但是此消息会通过服务器端转发,然后再到达目的客户端.共性化的昵称。为了区分用户,此程序还允许用户可以自定义共性化的昵称。在用户登录的时候,用户可以为自己设定一个昵称,以便在多人会话的时候作为身份识别。同时服务器端也会以此昵称作为客户端的登录身份,服务器管理员,同样也显示在其他用户的在线列表栏中。服务器登陆。服务器端开启之后处于监听状态,多线程工作,接受每一个用户的连接恳求。而客户端只需输入服务器端的IP地址即可,端口在服务器端自动生成。操作系统关键字:进程间通信;同步互斥;多线程操作ﻬ启动启动登陆等待客户端登陆客户端用户创建子套接字MessageChatServerChatClientMessage登陆成功连接上发送message显示找到客户端并显示登陆失败发送ID和IP
设计步骤:本谈天程序实现工具为VisualC++6。0MFC,主要利用其中用于网络编程的CSocket类实现网络通讯功能。主要程序分为两部分:服务器端,界面如下图所示:主要代码如下所示:(1)、CChatRoomServerDlg函数用来对服务器端进行初始化voidCChatServerDlg::OnPaint(){if(IsIconic())ﻩ{CPaintDCdc(this);//devicecontextforpaintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc。GetSafeHdc(),0); ﻩintcxIcon=GetSystemMetrics(SM_CXICON); ﻩintcyIcon=GetSystemMetrics(SM_CYICON);ﻩﻩCRectrect;ﻩﻩGetClientRect(&rect);ﻩﻩintx=(rect.Width()—cxIcon+1)/2;ﻩﻩinty=(rect.Height()—cyIcon+1)/2;ﻩﻩdc.DrawIcon(x,y,m_hIcon);}ﻩelseﻩ{CDialog::OnPaint();}}HCURSORCChatServerDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}//开头服务器按钮voidCChatServerDlg::OnButtonStart(){m_IDC_BUTTON_START.EnableWindow(FALSE);//让开启按钮失效if(!ListenSocket.Create(6400))//绑定端口{AfxMessageBox(”绑定端口失败!”);}ﻩif(!ListenSocket.Listen())//服务器侦听ﻩ{AfxMessageBox("侦听失败!");}ﻩAfxMessageBox("服务器开启成功!"); CStringtTmep; tTmep=”系统消息:服务器已开启成功!";ﻩm_ChatList.AddString(tTmep);ﻩm_IDC_BUTTON_STOP.EnableWindow(TRUE);//恢复停止按钮}voidCChatServerDlg::OnButtonStop(){m_IDC_BUTTON_STOP.EnableWindow(FALSE);ﻩchars[30]=”谈天服务器停止工作了!!"; ListenSocket。CCSL.Sends(s,30);//广播谈天服务器停止消息ﻩCClientSocket*p=ListenSocket。CCSL。Head;ﻩwhile(p)ﻩ{p—>Close(); ListenSocket.CCSL.Del(p);//释放链表中的套接字ﻩﻩp=ListenSocket.CCSL.Head;}ﻩListenSocket。Close();ﻩm_USER。ResetContent();//清楚服务器在线用户列表ﻩm_IDC_BUTTON_START.EnableWindow(TRUE);}voidCChaServerDlg::OnButtonSend(){ﻩintn;ﻩcharmessage[1000]; UpdateData(TRUE); if(m_IDC_BUTTON_MESSAGE=="”)ﻩ{MessageBox(”请输入消息!!”,"提示",MB_OK);} elseﻩ{m_IDC_BUTTON_MESSAGE=”服务器端说:”+m_IDC_BUTTON_MESSAGE;ﻩﻩn=m_IDC_BUTTON_MESSAGE.GetLength();ﻩ sprintf(message,"%s",m_IDC_BUTTON_MESSAGE。GetBuffer(n));ﻩﻩmessage[n]=0;ﻩ ListenSocket。CCSL.Sends(message,1000);}ﻩm_IDC_BUTTON_MESSAGE="";ﻩUpdateData(FALSE);}(2)、CClientSocket函数用于管理用户列表及会话voidCClientSocket::OnReceive(intnErrorCode){charbuff[1000];ﻩcharall_user[2000];ﻩcharname[20];ﻩintn;ﻩintm;ﻩn=this-〉Receive(buff,1000); buff[n]=0;ﻩcharFlag[10]; for(inti=0;i<8;i++)ﻩ{Flag[i]=buff[i];}ﻩFlag[8]=0;ﻩCChatRoomServerApp*pApp=(CChatRoomServerApp*)AfxGetApp(); CChatRoomServerDlg*pDlg=(CChatRoomServerDlg*)pApp->m_pMainWnd;if(strcmp(Flag,"NEW_USER")==0) {CStringsTemp;ﻩﻩfor(i=9;buff[i]!=0;i++)ﻩﻩ{buff[i-9]=buff[i];} ﻩbuff[i-9]=0;ﻩﻩsTemp.Format("%s”,buff); ﻩpDlg-〉m_USER.AddString(sTemp);ﻩﻩm=pDlg-〉m_USER.GetCount();ﻩ strcpy(all_user,”USERLIST”);ﻩﻩfor(i=0;i<m;i++)ﻩﻩ{pDlg—〉m_USER.GetText(i,name);ﻩﻩﻩstrcat(all_user,name);ﻩﻩ strcat(all_user,”|");} strcat(buff,"进入谈天室");ﻩﻩList—>Sends(all_user,strlen(all_user));} elseﻩ{if(strcmp(Flag,"CLOSEUSE”)==0) {CStringsTemp;ﻩﻩﻩfor(i=9;buff[i]!=0;i++)ﻩﻩﻩ{buff[i—9]=buff[i];}ﻩﻩﻩbuff[i-9]=0;ﻩﻩﻩsTemp.Format("%s”,buff);//离线用户昵称ﻩﻩﻩm=pDlg—〉m_USER.GetCount();ﻩﻩﻩfor(i=0;i<m;i++) ﻩﻩ{pDlg->m_USER。GetText(i,name);ﻩﻩ ﻩif(strcmp(name,buff)==0)ﻩ ﻩﻩ{pDlg->m_USER.DeleteString(i);ﻩﻩ }ﻩﻩﻩ//将新的在线用户昵称名单发给全部用户ﻩ ﻩm=pDlg—>m_USER.GetCount(); ﻩ strcpy(all_user,"USERLIST”);ﻩ ﻩfor(i=0;i<m;i++) ﻩ{pDlg—>m_USER.GetText(i,name);ﻩ ﻩstrcat(all_user,name);ﻩﻩﻩﻩstrcat(all_user,”|");ﻩﻩﻩstrcat(buff,"离开谈天室!"); ﻩﻩList->Sends(all_user,strlen(all_user));ﻩﻩ List->Del(this);} ﻩelseif(strcmp(Flag,"PrivChat")==0)//私聊ﻩﻩ{CStringsTemp;ﻩ ﻩfor(i=9;buff[i]!=’|';i++)ﻩﻩﻩ{buff[i-9]=buff[i];}ﻩﻩﻩbuff[i—9]=0; ﻩ sTemp。Format(”%s",buff);ﻩﻩﻩfor(intk=i+1;buff[k]!=0;k++)ﻩﻩﻩ{buff[k-i-1]=buff[k];}ﻩﻩﻩbuff[k-i-1]=0;ﻩﻩﻩm=pDlg—>m_USER。GetCount();ﻩ for(i=0;i<m;i++)ﻩﻩﻩ{pDlg-〉m_USER。GetText(i,name); ﻩ if(strcmp(name,sTemp)==0)ﻩﻩﻩﻩ{List-〉OnlySend(buff,strlen(buff),i);}ﻩ ﻩ}}ﻩ elseﻩ {List->Sends(buff,n);//将谈天信息群发给全部用户} }ﻩCStringsTemp;ﻩsTemp.Format(”收到:%s”,buff); pDlg->m_ChatList.AddString(sTemp); pDlg—>m_ChatList.SetTopIndex(pDlg-〉m_ChatList。GetCount()-1); CSocket::OnReceive(nErrorCode);}(3)、一下代码用于设定用户的多人会话与一对一会话BOOLCClientSocketList::Add(CClientSocket*add){CClientSocket*tmp=Head;ﻩif(!Head)ﻩ{Head=add;ﻩ returnfalse;}while(tmp->Next)ﻩ{tmp=tmp->Next;}ﻩtmp—〉Next=add;ﻩreturntrue;}//从链表队列中删除SocketBOOLCClientSocketList::Del(CClientSocket*d){CClientSocket*p1=Head;ﻩCClientSocket*p2;ﻩif(!Head) {returnfalse;}if(Head==d)ﻩ{Head=p1—〉Next;ﻩﻩp1—>Close(); deletep1;ﻩ returntrue;}for(;p1-〉Next!=NULL;p1=p1—〉Next)ﻩ{if(p1—>Next==d) {p2=p1—>Next; ﻩﻩp1->Next=p2->Next;ﻩﻩ p2—〉Close(); ﻩﻩdeletep2; ﻩﻩreturntrue;}} returnfalse;}//向全部用户发送消息BOOLCClientSocketList::Sends(char*buff,intn){CClientSocket*curr=Head;ﻩwhile(curr)ﻩ{curr->Send(buff,n); ﻩcurr=curr-〉Next;}ﻩreturntrue;}//仅仅向私聊用户who发送信息BOOLCClientSocketList::OnlySend(char*buff,intn,intwho){CClientSocket*curr=Head;ﻩwhile(curr&&who〉0) {curr=curr—〉Next;ﻩﻩwho--;}ﻩcurr—>Send(buff,n);ﻩreturntrue;}客户端,截图如下所示:主要代码:voidCChatDlg::OnConnectButton()//连接谈天室服务器{//TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);ﻩchar*nikename;ﻩchar*address;ﻩintn;ﻩif(!myServerSocket->Create())ﻩ{myServerSocket->Close();ﻩﻩAfxMessageBox("网络创建错误!!");ﻩﻩreturn;}ﻩn=m_IDC_EDIT_ADDRESS.GetLength();ﻩaddress=newchar(n+1);ﻩsprintf(address,"%s”,m_IDC_EDIT_ADDRESS.GetBuffer(n)); address[n]=0;ﻩn=m_IDC_EDIT_NIKENAME.GetLength();ﻩnikename=newchar(n+1);ﻩsprintf(nikename,"%s”,m_IDC_EDIT_NIKENAME.GetBuffer(n));ﻩnikename[n]=0;ﻩif(!myServerSocket->Connect(address,6767))ﻩ{myServerSocket->Close(); AfxMessageBox("网络连接错误,请检查服务器地址.");ﻩreturn;}ﻩm_BNSend.EnableWindow(TRUE); m_BNExit.EnableWindow(TRUE);ﻩmyServerSocket—〉NikeName=nikename; //发送新用户昵称ﻩcharmessage2[20];ﻩstrcpy(message2,"NEW_USER|”); strcat(message2,myServerSocket->NikeName);ﻩif(myServerSocket->Send(message2,20))//—————-——--连接谈天室服务器ﻩ{AfxMessageBox(”连接成功!!");}ﻩelse {AfxMessageBox(”网络传输错误!!!");}}voidCChatRoomDlg::OnSendButton(){//TODO:Addyourcontrolnotificationhandlercodehere intn;ﻩcharmessage[1000];ﻩCStringto_name;ﻩUpdateData(TRUE);ﻩif(m_IDC_EDIT_MESSAGE=="”)ﻩ{MessageBox("请输入要发送的消息!”,”提示”,MB_OK);} elseﻩ{if(m_SL==TRUE)//私聊 ﻩ{if(m_USER。GetCurSel()>=0)ﻩ ﻩ{m_USER。GetText(m_USER.GetCurSel(),to_name);ﻩﻩﻩﻩm_IDC_EDIT_MESSAGE=myServerSocket—>NikeName+m_IDC_EDIT_MESSAGE; ﻩﻩﻩm_ChatList。AddString(m_IDC_EDIT_MESSAGE);ﻩﻩﻩm_IDC_EDIT_MESSAGE=”PrivChat|"+to_name+”|”+m_IDC_EDIT_MESSAGE;ﻩﻩﻩﻩn=m_IDC_EDIT_MESSAGE。GetLength();ﻩﻩﻩﻩsprintf(message,”%s",m_IDC_EDIT_MESSAGE。GetBuffer(n)); ﻩﻩmessage[n]=0;}ﻩﻩﻩelseﻩﻩﻩ{AfxMessageBox("没有私聊对象!");ﻩﻩﻩ return;}}ﻩﻩelse ﻩ{m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+m_IDC_EDIT_MESSAGE;ﻩﻩﻩn=m_IDC_EDIT_MESSAGE.GetLength(); ﻩsprintf(message,”%s”,m_IDC_EDIT_MESSAGE.GetBuffer(n));ﻩﻩ message[n]=0;} ﻩif(myServerSocket->Send(message,n+1))ﻩﻩ{m_IDC_EDIT_MESSAGE="";ﻩﻩﻩUpdateData(FALSE);}ﻩﻩelse ﻩ{AfxMessageBox("网络传输错误!");}}}voidCChatRoomDlg::OnExitButton(){//TODO:Addyourcontrolnotificationhandlercodehereﻩcharmessage2[20];ﻩstrcpy(message2,"CLOSEUSE|”); strcat(message2,myServerSocket-〉NikeName);ﻩif(myServerSocket-〉Send(message2,20))//—————-——离开谈天室ﻩ{}ﻩelse {AfxMessageBox("网络传输错误!");}ﻩCDialog::OnOK();}BOOLCChatRoomDlg::GetMessage()//显示谈天信息{charbuff[2000]; charname[20]; intcount; count=myServerSocket-〉Receive(buff,2000);ﻩbuff[count]=0;ﻩcharFlag[10];ﻩfor(inti=0;i<8;i++)ﻩ{Flag[i]=buff[i];}Flag[8]=0;if(strc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代企业管理中跨部门项目协作的技巧
- 知识产权保护与教育创新
- 2025宁夏公路勘察设计院有限责任公司招聘10岗21人笔试参考题库附带答案详解
- 2024福建莆田市兴安保安服务有限公司招聘总经理1人笔试参考题库附带答案详解
- DBJ04-232-2005 线型光纤感温火灾探测系统设计、施工及验收规范
- 2024年福建省船舶工程技术学校公开招聘工作人员2人笔试参考题库附带答案详解
- 浙江邮电职业技术学院《小学语文专题研究》2023-2024学年第二学期期末试卷
- 2025-2030年可成长式儿童学习桌行业跨境出海战略研究报告
- 2025-2030年在线历史小说连载行业跨境出海战略研究报告
- 2025-2030年可定制消毒用品外观行业跨境出海战略研究报告
- -6-35kV中压交联电缆产品基础知识培训
- 人教版一年级下册数学20以内的退位减法(作业设计)
- 8款-组织架构图(可编辑)
- 30道医院妇产科医生岗位高频面试问题附考察点及参考回答
- 21中华文化-2023年中考英语新热点时文阅读
- 卷内目录范例模板
- 学校课程整体框架图
- 环境卫生学第二章 环境与健康的关系
- 2024届高考语文复习:小说阅读之叙事顺序与叙事节奏
- 新生儿肺透明膜病的影像与临床探讨
- 动力触探检测报告超重型圆锥动力触探试验
评论
0/150
提交评论