山东建筑大学1摘要..................................................................................................................................................2正文..................................................................................................................................................3一.设计目的...........................................................................................................................3二.设计要求...........................................................................................................................3三.设计内容...........................................................................................................................33.1系统分析....................................................................................................................33.2具体实现步骤............................................................................................................41.项目创建:.........................................................................................................42.界面设计.............................................................................................................4代码编写...................................................................................................................6运行结果:.............................................................................................................16总结与致谢....................................................................................................................................18参考文献........................................................................................................................................19山东建筑大学2摘要随着计算机网络的发展,深刻的影响着人们的聊天和交流方式,过去的种种的陈旧的联系方式,已经不能满足现代生活的需要,所以聊天系统应运而生。聊天程序主要通过传输文本来实现彼此的沟通、信息的交流。本聊天程序设计主要运用了VisualC++编程环境,实现了用户的即时聊天功能。聊天程序一般由两大部分组成:服务器端聊天程序和客户端聊天程序。服务器端聊天程序负责接收来自客户端的聊天信息,并且根据客户端的要求把这些信息转发到另外一个或多个客户中。客户端聊天程序则负责建立和维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接收对方的响应。关键词:聊天系统,Visualc++,计算机网络的发展。山东建筑大学3正文一.设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力二.设计要求本设计的聊天程序功能要求如下可以手动输入服务器IP地址和端口号进行连接(客户端功能)可以手动建立服务器接受其他客户端的连接要求(服务端功能)可以发送消息给服务端,显示服务端传来的消息(客户端功能)可以接收客户端发送的消息,并将消息传给所有在线的客户端(服务端功能)三.设计内容3.1系统分析1.服务端需要完成的3件事情(1)在特定的端口上等待来自客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2)及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。(3)监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,山东建筑大学4因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。2.客户端需要完成的3件事情(1)建立和维护与服务器的连接,并且随时检测连接的状态。(2)把用户输入的信息及时发送到服务端,同时,随时准备好接受服务端的信息,并把它显示出来。(3)在用户推出聊天过程时要关闭与服务器的连接。客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能3.2具体实现步骤1.项目创建:本例将使用VisualC++6.0创建一个基于对话框的MFCAppWizard(exe)项目取名为“Chat”。在MFC向导的第一步界面中选择“Dialogbased”单选按钮,在MFCAppWizard向导的第二步界面中选择“WindowsSockets”复选框,其它均采用默认设置。2.界面设计打开IDD_CHAT_DIALOG对话框,该对话框将是程序运行时的主界面,以下是为对话框添加的控件。如下所示:IDD_CHAT_DIALOG对话框中的主要控件山东建筑大学5完成控件添加后的对话框如下图所示:ID属性设置分组框IDC_STATIC标题“”静态文本IDC_STATIC标题“IP地址”IP地址控件IDC_SERVERIP默认静态文本IDC_STATIC标题“端口”编辑框IDC_PORT默认分组框IDC_STATIC标题“聊天记录”编辑框IDC_SHOWTEXT样式:多行,只读静态文本IDC_STATIC标题“昵称”编辑框IDC_NAME默认命令按钮IDC_CONNECT标题“连接服务器”命令按钮IDC_SETSERVER标题“建立服务器”静态文本框IDC_STATIC标题“消息”编辑框IDC_INPUTTEXT默认命令按钮IDC_SEND标题发送”山东建筑大学6添加完上述控件后,打开Classwizard,为IDD_CHAT_DIALOG指向的CChatRoomDig类按照如下表添加成员变量。成员变量的添加控件ID变量名数据类型IDC_PORTm_uportUNITIDC_SHOWTEXTm_sShowStringCStringIDC_NAMEm_sNameCStringIDC_INPUTTEXTm_sInputTextCString代码编写源代码I服务器://ServerDlg.cpp:implementationfile//山东建筑大学7#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)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_A