目录[摘要]…………………………………………………………………3一设计内容…………………………………………………………..31、设计目的……………………………………………………………………32、设计要求……………………………………………………………………3二设计原理……………………………………………………………3三设计过程…………………………………………………………….41、程序设计流程及源代码…………………………………………………….4(1)流程图……………………………………………………………………….4(2)源代码……………………………………………………………………….4I服务器………………………………………………………………………4II客户端……………………………………………………………………..92、调试分析过程描述……………………………………………………………143、结果分析………………………………………………………………………19[结论]………………………………………………..………………….20[参考文献]………………………………………………….…………..202[摘要]当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室,从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。而在SOCKETAPI的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。[正文]一、设计内容1、设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2、设计要求采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCKI/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。二、设计原理服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地3址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。socket聊天室基本原理是,抛开CGI(公共网关接口)和服务器,根据html规范,接收到浏览器的请求以后,模仿服务器的响应,将聊天内容发回浏览器。在浏览器看来就像浏览一个巨大的页面一样始终处于页面联接状态,这就是一个专门的聊天服务器,一个简化了的服务器。三、设计过程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:4CAboutDlg();protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)END_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;//returnTRUEunlessyousetthefocustoacontrol5}voidCServerDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}}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);//放入链表中6m_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();CMySocket*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_CL