您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 网络编程课程设计-简单的聊天室程序设计
网络与通讯程序设计班级:03073学号:030740303姓名:乔治指导老师:贺刚时间:2010.06.062目录[摘要]…………………………………………………………………3一设计内容…………………………………………………………..31、设计目的……………………………………………………………………32、设计要求……………………………………………………………………3二设计原理……………………………………………………………3三设计过程…………………………………………………………….41、程序设计流程及源代码…………………………………………………….4(1)流程图……………………………………………………………………….4(2)源代码……………………………………………………………………….4I服务器………………………………………………………………………4II客户端……………………………………………………………………..92、调试分析过程描述……………………………………………………………143、结果分析………………………………………………………………………19[结论]………………………………………………..………………….20[参考文献]………………………………………………….…………..203一、设计内容1、设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2、设计要求采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCKI/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。二、设计原理服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。socket聊天室基本原理是,抛开CGI(公共网关接口)和服务器,根据html规范,接收到浏览器的请求以后,模仿服务器的响应,将聊天内容发回浏览器。在浏览器看来就像浏览一个巨大的页面一样始终处于页面联接状态,这就是一个专门的聊天服务器,一个简化了的服务器。4三、设计过程1、程序设计流程及源代码(1)流程图(2)源代码I服务器://ServerDlg.cpp:implementationfile//#includestdafx.h#includeServer.h#includeServerDlg.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public:CAboutDlg();protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)5END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CServerDlgdialogCServerDlg::CServerDlg(CWnd*pParent/*=NULL*/):CDialog(CServerDlg::IDD,pParent){m_hIcon=AfxGetApp()-LoadIcon(IDI_ICONAPP);}voidCServerDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX,IDC_LIST_USER,m_lbUser);DDX_Text(pDX,IDC_EDIT_DISPLAY,m_strDisplay);}BEGIN_MESSAGE_MAP(CServerDlg,CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_START,OnBnStart)ON_BN_CLICKED(IDC_BN_CLOSE,OnBnClose)ON_MESSAGE(WM_RECEIVE,OnReceive)ON_MESSAGE(WM_CLIENTCLOSE,OnClientClose)ON_MESSAGE(WM_ACCEPT,OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CServerDlgmessagehandlersBOOLCServerDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}SetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//Setsmalliconm_iNetPort=3127;m_Server.Initialize(this);m_bServer=FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCServerDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}6}voidCServerDlg::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();}}HCURSORCServerDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}voidCServerDlg::OnBnStart(){//创建套接字m_Server.Create(m_iNetPort);//开始监听m_Server.Listen();//显示CStringstrInfo;strInfo.LoadString(IDS_CREATE_SERVER);ShowInDisplay(strInfo);m_bServer=TRUE;GetDlgItem(IDC_BN_START)-EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(TRUE);}voidCServerDlg::OnBnClose(){CloseServer();GetDlgItem(IDC_BN_START)-EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);}voidCServerDlg::OnAccept(){//创建新客户CMySocket*pNewClient=newCMySocket;pNewClient-Initialize(this);m_Server.Accept(*pNewClient);//放入链表中m_lsClient.AddTail(pNewClient);}voidCServerDlg::OnClientClose(WPARAMwParam,LPARAMlParam){CMySocket*p_delClient=(CMySocket*)wParam;//关闭该用户p_delClient-ShutDown();charbuffer[BUFFERSIZE];while(p_delClient-Receive(buffer,BUFFERSIZE)0);p_delClient-Close();//在用户链表中删除该用户POSITIONpsCur,psList=m_lsClient.GetHeadPosition();7CMySocket*p_curClient;while(psList!=NULL){psCur=psList;p_curClient=(CMySocket*)m_lsClient.GetNext(psList);if(p_delClient==p_curClient){m_lsClient.RemoveAt(psCur);break;}}//发送信息告诉其他用户该客户退出CStringstrMsg;strMsg.LoadString(IDS_CLIENT_CLOSE);NETMESSAGEnetMessage(PTC_CLIENT_QUIT,p_delClient-GetName(),_T(),p_delClient-GetName()+strMsg);SendToAllClient(netMessage);//界面上清理该用户信息m_lbUser.DeleteString(m_lbUser.FindString(-1,p_delClient-GetName()));ShowInDisplay
本文标题:网络编程课程设计-简单的聊天室程序设计
链接地址:https://www.777doc.com/doc-6425973 .html