MFC-VC++简单的聊天程序网络程序设计课程设计报告_第1页
MFC-VC++简单的聊天程序网络程序设计课程设计报告_第2页
MFC-VC++简单的聊天程序网络程序设计课程设计报告_第3页
MFC-VC++简单的聊天程序网络程序设计课程设计报告_第4页
MFC-VC++简单的聊天程序网络程序设计课程设计报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《网络程序设计》课程设计报告书题目:简单的聊天室程序专业:软件工程学号:20133481学生姓名:杜闻播指导教师:魏宁完成日期:2016.1.9

题目及要求本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。本实例程序的技术要点是:如何从CasyncSocket类派生出自己的WinSock类。理解WinSock类与应用程序框架的关系。重点学习流式套接字对象的使用。处理网络事件的方法。本程序的需求主要为以下几点:用户端之间的信息发送,本程序需要实现的最基本的功能。用户在界面上可以将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息。在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在监听状态,服务器在监听状态才能正常使用客户端,如果服务器不在监听状态,则在检测一定次数以后自动退出客户端程序。

系统概要设计2.1使用的函数介绍:BOOLCAsyncSocket::Create(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,longlEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL);用于创建一个本地套接口,其中nSocketPort为使用的端口号,为零则表示由系统自动选择,通常在客户端都使用这个选择。nSocketType为使用的协议族,SOCK_STREAM表明使用有连接的服务,SOCK_DGRAM表明使用无连接的数据报服务。lpszSocketAddress为本地的IP地址。BOOLCAsyncSocket::Bind(UINTnSocketPort,LPCTSTRlpszSocketAddress=NULL)作为等待连接方时产生一个网络半关联,或者是使用UDP协议时产生一个网络半关联。BOOLCAsyncSocket::Listen(intnConnectionBacklog=5)作为等待连接方时指明同时可以接受的连接数,请注意不是总共可以接受的连接数。BOOLCAsyncSocket::Accept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL)作为等待连接方将等待连接建立,当连接建立后一个新的套接口将被创建,该套接口将会被用于通信。BOOLCAsyncSocket::Connect(LPCTSTRlpszHostAddress,UINTnHostPort);作为连接方发起与等待连接方的连接,需要指明对方的IP地址和端口号。voidCAsyncSocket::Close();关闭套接口。intCAsyncSocket::Send(constvoid*lpBuf,intnBufLen,intnFlags=0)intCAsyncSocket::Receive(void*lpBuf,intnBufLen,intnFlags=0);在建立连接后发送和接收数据,nFlags为标记位,双方需要指明相同的标记。intCAsyncSocket::SendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0)intCAsyncSocket::ReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0);对于无连接通信发送和接收数据,需要指明对方的IP地址和端口号,nFlags为标记位,双方需要指明相同的标记。2.2控件使用:控件ID变量名称IDC_BUTTON_CONNECTm_btnConnectIDC_EDIT_SERVNAMEm_strServNameIDC_EDIT_SERVPORTm_strServPortIDC_EDIT_MSGm_strMsgIDC_LIST_SENTm_listSentIDC_LIST_RECEIVEDm_listRecetved2.3变量声明:权限类型变量名功能publicCListBoxm_listSent发送窗口publicCListBoxm_listReceived接收窗口publicCButtonm_btnConnect连接按钮publicCStringm_strMsg要发送的信息publicCStringm_strServName服务器名publicintm_nServPort端口publicCMySocketm_sConnectSocket套接字2.4函数声明:返回值函数名功能voidOnReceive(intnErrorCode)接收信息voidOnClose(intnErrorCode)关闭连接voidSetParent(CTalkcDlg*pDlg)设置套接字上下文voidOnConnect(intnErrorCode)创建连接voidOnSendMsg()发送信息2.5界面操作:(1)客户端程序执行界面:客户端输入服务器名,端口号,点击连接,与服务器创建连接,执行对话。(2)服务端程序执行界面:服务端设置服务器名,端口号,点击监听,与等待客户端与其连接。2.6程序执行结构图:2.6.1客户端程序的类与消息驱动图2.6.12.6.2服务端程序的类与消息驱动图2.6.2

系统详细设计1.消息接收:主要应用socket的Receive(void*pBuf,intnBufSize,intnFlag=0)函数,实现消息的接收。voidCTalkcDlg::OnReceive(){ char*pBuf=newchar[1025];//客户机的数据接收缓冲区 intnBufSize=1024;//可接受的最大长度 intnReceived;//实际接收到的数据长度 CStringstrReceived; m_listReceived.AddString("客户机收到了OnReceive消息"); //接收套接字中的服务器发送来的消息 nReceived=m_sConnectSocket.Receive(pBuf,nBufSize); if(nReceived!=SOCKET_ERROR)//接收成功吗? { //如果接收成功,将字符串的结尾置为空 pBuf[nReceived]=NULL; strReceived=pBuf;//把消息复制到串变量中 //把消息显示到“接收到的数据”列表中 m_listReceived.AddString(strReceived); UpdateData(FALSE);//更新对话框 } else { AfxMessageBox("信息接收错误!",MB_OK|MB_ICONSTOP); }}2.消息发送:主要应用socket的Send(constvoid*lpBuf,intnBufLen,intnFlag=0)函数,实现消息的发送。voidCTalkcDlg::OnSendMsg(){ //TODO:Addyourcontrolnotificationhandlercodehere intnLen;//消息的长度 intnSent;//被发送的消息的长度 UpdateData(TRUE);//从对话框获取数据 //有消息需要发送吗? if(!m_strMsg.IsEmpty()) { nLen=m_strMsg.GetLength();//得到消息的长度 //发送消息,返回实际发送的字节长度 nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen);if(nSent!=SOCKET_ERROR)//发送成功吗? { //成功则把消息添加到发送列表框 m_listSent.AddString(m_strMsg); UpdateData(FALSE);//更新对话框 }else { AfxMessageBox("信息发送错误!",MB_OK|MB_ICONSTOP); } m_strMsg.Empty();//清除当前的消息 UpdateData(FALSE);//更新对话框 }}3.断开连接:主要用但socket的Close()函数。voidCTalkcDlg::OnClose(){ m_sConnectSocket.Close();//关闭客户端的连接套接字 //禁止消息发送的对话框中的控件,如“消息”文本框,“发送”按钮和“断开”按钮 GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE); GetDlgItem(IDOK)->EnableWindow(FALSE);//bottonsend GetDlgItem(IDC_STATIC_MSG)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE); //清除两个列表框 while(m_listSent.GetCount()!=0) m_listSent.DeleteString(0); while(m_listReceived.GetCount()!=0) m_listReceived.DeleteString(0); //开放连接配置的相关控件,如“连接”按钮、服务器名、端口的文本框和标签 GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(TRUE);}连接到服务器:利用socket的Create()和Listen()函数。voidCTalksDlg::OnButtonListen(){ //TODO:Addyourcontrolnotificationhandlercodehere //从对话框获取数据 UpdateData(TRUE); //禁止“监听”按钮,服务器名和端口的文本框 GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(FALSE); //用指定的端口创建服务器端监听套接字对象的底层套接字 m_sListenSocket.Create(m_nServPort); //开始监听客户机端的连接请求 m_sListenSocket.Listen();}

课程设计总结在这次课程设计中我的收获颇多对WinSocket编程有了更深入的了解,能够把课上学的理论知识应用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论