计算机网络课程设计报告--简单的即时通信软件.docx
课程设计报告20142015学年第一学期课程名称计算机网络设计题目简单的即时通信软件本文介绍了即时通信系统的程序设计和功能实现。该系统主要是基于TCP与UDP的C/S模式通信系统。该项目由两个主程序组成:服务器端应用程序,客户机端应用程序。服务器启动监听进程,监听连接申请,对于来申请的客户机,或者说申请的ID,服务器进程将会对进行判别和分类,满足服务器要求就进行连接,从而实现客户端的通信。该系统界面友好,操作简单,适应性强,扩展性强。关键字:即时通信;服务器;客户端;目录3第1章引言41.1 概述41.2 研究背景41.3 软件简介41.4 软件开发方法4第2章软件分析52.1 可行性分析52.2 功能分析5第3章软件设计与实现73.1 项目系统模型73.2 开发及运行环境73.3 软件结构设计73.4 软件功能设计83.5 服务器端应用程序103.5.1 服务器端应用程序的创建流程103.5.2 实现界面设计103.5.3 定义类设计113.5.4 实现类中的函数133.5.5 实现界面功能按钮203.5.6 测试213.6 客户端应用程序213.6.1 界面设计213.6.2 控件的编辑与绑定223.6.3 定义类设计和实现类设计中的函数233.6.4 实现界面功能按钮233.6.5 测试23第4章软件结构254.1 服务器端结构254.2 客户端结构25第5章软件评价27结束语28致谢29附录参考文献30第1章引言1.1 概述即时通信(InstantMessaging)是基于互联网协议的应用程序,它能够使应用不同类型设备的用户一对一进行通信。IM最传统的形式是聊天,聊天即双方互相传送信息。与电子邮件服务相比,聊天服务更具有实时性,更便于人们相互沟通和交流信息。而套接字是通信双方一种相互约定的通信方式和规则,在TCP/IP通信中一般使用套接字的相关函数接口来完成通信过程。区分不同应用程序进程间的网络通信和连接,主要有三个通信的目的IP地址,使用的传输层协议,使用的端口号。通过这三种参数就可以识别客户端双方的身份进行可以放心的通信。本系统在此基础上设计的一个简单的通信系统。1-2研究背景随着互联网的发展,聊天服务已成为必不可少的互联网服务之一,它方便远距离人们的信息的交流,简单易操作,又保证的即时性,使人们更能享受互联网带来的好处。典型的IM是样工作的:当好友列表中的某人在任何时候登录上线并试图通过用户怕计算机联系用户时,IM系统会发一个消息提醒用户,然后用户能与对方建立一个聊天会话界面并键入消息文字进得交流。自1999年,腾讯公司自主开发了基于Internet即时通信网络工具一腾讯即时通信(QQ),其合理的设计,良好的易用性,强大的功能,稳定高效的系统运行,赢得了用户的青睐。与电子邮件服务相比,聊天服务具有实时性,人们更便于相互沟通,交流思想和信息。所以即时通信系统已成为人们研究的热点。1.3 软件简介该软件是基于客户机/服务器(Client/Server)模式的聊天室系统,此设计采取监听对话模型。基本思路是:服务器启动监听进程,监听连接申请,对于来申请的客户机,或者是申请的ID,服务器进程将会对其判别与分类,满足服务器要求进行连接。1.4 软件开发方法本软件是利用ViSUalC÷÷6.O这个集成开发环境设计并实现一个基于C/S模型的聊天室。1 .该软件是使用MFC库开发基于对话框形式的网络聊天室系统。MFC库可以开发内容和功能都非常丰富的WindoWS程序,但万变不离其中,都是围绕着MFC(即继承MFC类进行开发)库实现的。MFC类家族很庞大,但有几个是程序运行必备的类:CobjeCt类:该类完成动态空间的分配与回收。CCmdTarget类:CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息的发送,等待和派遣工作,实现应用程序的对象之间的协调运行。CWinAPP类:CWinAPP类是应用程序的主线程类,它是从CWinThread类派生而来。CDoCUnIent类:CDOCUment类是文档类,包含了应用程序在运行期间所用到的数据。CWnd类:CWnd类是一个通用窗口类,用来提供WindOWS中所有通用特性。CVieW类:CVieW类是用于让用户通过窗口来访问文档以用负责文档内容的显示。CFrameWnd类:是CWnd的派生,并实现了标准的框架应用程序。CDialog类:CDiaIOg类用来控制对话框窗口,并选择从CDialog类继承。2 .VC+提供了多种对网络编程的支持,主要有SoCket支持,WinInet支持,MAPlT和ISAPl支持等。WindowsSocketsAPI是Win32APl的一个子集,是在TCP/IP网络环境里也是Internet上进行开发的最常用的API。第2章软件分析2.1 可行性分析即时通信(InstantMessaging),是近年来逐渐兴起的网络应用之一,面向大众娱乐聊天休闲的即时软件层出不穷,如QQ,MSN,Yahoo,Messenger等等。它通过通信系统建立网络虚拟环境,商务通讯及商务合作的新媒体,可以弥补传统通讯形式的不足,尤其是电子邮件及语音的不足,为用户提供了有效的沟通手段。即时通信系统是随着互联网的出现而兴起的新型通信手段。最早,即时通信系统对人们来说只是一个网络寻找朋友的聊天的工具,但是,随着互联网使用的逐渐丰富和完善,一个综合的桌面通信平台出现了,该平台已经成为一个地地道道的通信工具,并可能成为继电话,电子邮件之后的第三种现代通信方式。在各个领域,即时通信系统作为一种低成本的,集成多种沟通方式(文字,语音,视频,文件传输,文件共享)软件已经成为如今天通用的流行通信方式。如所即时通信系统的研究与开发已成为现今的热点。2.2 功能分析即时通信的主要功能如下:令服务器的建立:这个是实现聊天的关键,只有建立了聊天服务器,客户才能连接到上面从而进行聊天过程的实现,服务器建立之后牌监听状态,等待客户机的申请连接。令选择连接方式:在服务器建立的时候,要选择是何种连接方式,TCP还是UDP,选择不同,将会受用不同的消息处理机制。同时将确定连接地址和端口号。令启动客户端:开始尝试对服务器进行连接操作,这里面注意之处就是客户机要选择和服务器一致的连接方式,填入正确的连接地址和端口号。令启动对话:成功建立连接后,开始进行对话操作,对就不同的方面,出现的消息也是不的,这样做的好处就是能够屏蔽他人的信息,而只要求显示对自己有用的信息,一来可以节省程序设计的耗时,二来可以保护聊天室中的隐私。令多用户的信息交互:当建立一个连接后,其他的客户机也是可以再连接到上面,进行多用户的聊天。令退出聊天系统:聊天结束之后,客户机断开连接就可以退出聊天室,信息不再交互,如是服务器关闭,连接在上面的所有客户机将会断开。第3章软件设计与实现3.1项目系统模型该项目由两个程序组成:令服务器端应用程序:主要是负责信息转发和存储,以及通信端口和通信用户的管理。令客户机端应用程序:主要是负责提供给非专业技术人员用户,用户通过客户机可以和其他客户机或者服务器进行通信。本项目的系统模型如图1.1所示。图1.1系统模型3.2 开发及运行环境本系统运行时需要以下条件硬件平台: CPU:Pentium41.8GHZ 内存:256MB以上软件平台: 操作系统:WindowsXP/Windows2000Win7 开发工具包:ViSUalC+6.03.3 软件结构设计该软件是基于客户机/服务器(CIiem/Server)模式的聊天室系统,此设计采取监听对话模型。基本思路是:服务器启动监听进程,监听连接申请,对于来申-7-请的客户机,或者是申请的ID,服务器进程将会对其判别与分类,满足服务器要求进行连接。连接后,客户机端用户就可以进行通信了。系统框架图如图1.2所示。服务器连功交始启动监听迸程接成 ,信息 互开I身份 确认图1.2聊天室的C/S模型设计框架3.4 软件功能设计实现基于对话框的网络聊天通信则需要实现以下几个功能:1)建立通信框架首先利用MFCAPPWiZard生成系统框架:在ViSUaIC+6.0的IDE的环境下选择FileNewProjectMFCAppWizard(exe)ProjectNameOKNEXTWindowSocketsIFinish按钮,选择OK按钮,应用程序的框架就将自动创建。之后增加控件对象,布置程序的主对话框,通信框架就建立成功了。2)网络连接类CsocketComm该类的定义和实现,完成了C/S模型的连接处理,也就是所谓的“信道通信”部分。由于本系统集成TCP和UDP的聊天程序,所以在系统中有所区别.主要实现的接口功能包括:创建服务器端SoCkeI,获取主机IP,获取服务器端口号,获取本地地址,获取主机名字,数据接收,发送,以及关闭通信等。3)创建服务器SerVer首先需要创建SOCket,在函数CreateSoCket()中创建SoCket,由于传输中有TCP和UDP两种方式,函数CreateSoCket()中根据传递过来的参数nType的值对这两种不同的传输方式进行选择,该函数不管TCP还是UDP连接,都是通用的。当nType=SOCK_DGRAM时为UDP;当nType=SOCK_STREAM时为TCPo有所区别的是,在UDP中如时要进行广播,需要进行互斥操作,防止同一时间不同的UDP广播;在TCP连接模式中,没有UDP传输模式中的广播模式,但是在TCP连接需要保存SOCket,保证连接的存在和数据到达的准确性。服务器的主要功能包括启动服务器,更新服务器、关闭服务器、发送与接收信息,以及设定相关选项。4)创建客户机CIient客户机的创建和服务器的创建同等重要,都是通信的实体。客户端通过函数ConnectTO来进行连接申请,首先判断Socket是否已连接,如果创建就返回false,否则就创建Socketo创建好Socket之后和本地地址绑定,再获取远程服务器的地址和端口号,确定好服务器,就调用ConneCt()将客户机连接到服务器。5) UDP中多用户聊天的实现首先,服务器创建UDP类型的套接字并绑定服务端口,并使得该套接字处于未连接状态;接下来就循环读取来自客户机的请求,将其地址保存起来,写入地址表m.AddListo服务器端接收客户机发送过来的数据时,先判断缓冲区是否够大,足够大刚写入缓冲区;向客户机发送数据时,通过广播的形式,先锁定地址列表LoCkLiSt(),然后通过for循环语句,对地址列表中的每个地址通过函数Sendto()发送数据到客户机。期间,若某客户机与服务器断开连接,刚从地址列表中删除其地址信息,之后将不再发送数据。6)退出系统当客户端选择退出系统时,则断开与服务器的连接,不开转发其信息。3.5 服务器端应用程序3.5.1 服务器端应用程序的创建流程创建流程如下:3.5.2 实现界面设计实现界面设计不仅仅是设计一个界面,还需要对界面的控件名称和控件绑定的变量进行定义。(1)界面设计服务器的对话框界面如图1.3所示。图1.3服务器端应用程序界面设计(2)编辑控件与变量绑定设置界面中的3个编辑框的ID和与之绑定的变量,如表1.4所示。表1.4编辑框控件和变量的绑定编辑控件的内容ID类型变量名服务器端口IDC_EDIT_P0RTCStringm_strPort聊天记录IDC_EDIT_MSGRERCEditM_ctrlMsgRecord发送消息IDC_EDIT_MSGCEditM-ctrlMsg端口微调控件1DC_SPINPORTCSpinButtonCtrlM_ctrlSpinPort3.5.3定义类设计服务器有2个基本功能:聊天记录的转发、端口管理。将这两个功能封装在两个类中:CSOCketComm类:该类负责网络连接,信息转发等。令CSOCketManager类:该类负责端口的管理。CSocketComm类中的主要函数功能:1) staticSOCKETWaitForConnection(SOCKETsock);等待新的连接。2) staticboolShutdownConnection(SOCKETsock);关闭连接。3) staticUSHORTGetPortNumber(LPCTSTRStrServiceName);获得月艮务端口号。4) staticULONGGetIPAddress(LPCTSTRStrHostName);获得主机IP地址。5) staticboolGetLocalName(LPTSTRStrName,UINTnSize);获得机器名。6) staticboolGetLocalAddress(LPTSTRStrAddress,UINTnSize);获得本地地址。CSocketComm类代码如下:public:classCSocketConnCSocketConnO;是否正确virtualzvCSocketComnO;boolIspen()const;/判断SOCket是否正希boolIsStartOconst;/喊福是否启窃boolIsBroadcastOconst;/是否允许UDP广播boolIsSnartAddressingOconst;/IsSnartAddressingnodesupportSOCKETGetSocketOconst;/族回SOCket句柄uoidSetSartAddressing(boolbSmartAddressing);/SetSnartaddressingnodeboolGetSockNane(SockAddrIn&saddr_in);/药导SOCket:名即地址boolGetPeerName(SoCkAddrIn&saddr_in);/叁律PeerSocket名-地址uoidAddToList(constSockAddrInftsaddr_in);洲务地址增加到歹住uoidRenoueFronList(constSockAddrIn&Saddjinj;/从列表中删除列表uoid CloseConnO; bool WatchConnO; uoid StopCon();/关闭Socket启动Socket线程停止Socket线程创建服务器端SoCketboolCreateSocket(LPCTSTRStrSeruiceNane,intnProtocol,intnTypefUINTUOptions=0);事件处理函数-接收数据virtualuoidOnDataReceiued(constLPBVTEIpBuffervDWORDduCount);virtualuoidOnEuent(UIHTuEuent);主名婿函数virtualuoidRun();CSocketManager类中的主要函数如下:1) virtualvoidOnDataReceived(constLPBYTEIpBuffer,DWORDdwCount);接收数据2) voidDisplayData(constLPBYTEIpData,DWORDdwCount,constSockAddrIn&sfrom);显示数据CSocketManager类代码如下classCSocketManager:publicCSocketConn<public:CSocketManagerO;uirtual,vCSocketManager();uoidSetHessageVindow(CEdit*pMsgCtrl);uoidAPPendMeSSage(LPCTSTRStrText);public:uirtualuoidOnDataReceiued(constLPBVTEIpBuFfer,DWORDdCount);uirtualuoidOnEuent(UINTEuent);protected:uoidDisplayData(constLPBVTEIpData,DWORDdwCount,constSockAddrInStSfrom);CEdit*npMsgCtrl;3.5.4实现类中的函数CSocketComm类主要实现5个功能:获取本机地址、创建套接字、关闭套接字、数据读入、数据发送。CSoCketManager类实现数据显示。开发流程如下:1 .获取本地计算机机器名及IP地址。获取本地计算机机器名及IP地址及端口号,为了区分不同的应用进程和连接事务,用于本地计算机用户进行通信。实现代码如下:获得本地机器名boolCSocketCoinm:ZGetLocalName(LPTSTRStrNane,UINTnSize)if(StrNane?=NULL&&nSize>0)charstrHostHOSTNAME_SIZE=0;获得机器名if(SOCKET_ERROR!=gethostnane(strHost,SizeoF(StrHost)structhostent*hp;|hp=gethostbyname(strHost);if(hp?=NULL)strcpy(strHost,hp->h-name);检查缓冲区大小if(Strlen(StrHost)>nSize)SetLastError(ERROR_INSUFFICIENT_BUFFER);returnFalse;获取本地计算机的标准IP地址,"127.0.0.0boolCSocketConn:GetLocalAddress(LPTSTRStrAddress,UINTnSize),/获得计算机本地地址if(StrAddress?=NULL&&nSize>O)charstrHostHOSTNAHE_SIZE=O;获得机器名if(SOCKET_ERROR?=gethostnane(strHost,Sizeof(StrHost)structhostent*hp;hp=gethostbynane(strHost);if(hp=NULL&&hp->h_addr_list0?=NULL)/查看地址是否是年节大小iF(hp->hjength<4)returnFalse;/转化地址到点strHost0=0;/创建地址字符创sprintf(strHost,"%uuuu",hp->h_addr_list)0)9 hp->hZaddlist0)1), hp->h_addr_list0)2), hp->haddlist 0)3);(UINT)(PBVTE)(UINT)(PBVTE)(UINT)(PBVTE)(UINT)(PBVTE)/检查缓冲区是否足够if(Strlen(StrHost)>nSize)SetLastError(ERRoRsINsUFFICIENTJUFFER);returnfalse;>/UniCOde转换Hifdef,UNICODEreturn(O?=MultiByteToWideChar(CPJ)CP,O,strHost,-1,StrAddressynSize,NULL,NULL);ttelse-tcscpy(strAddress,strHost);returntrue;IendifelseSetLastError(ERROR.INUALIDJARAMETER);returnfalse;2 .创建套接字。套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。套接字主要有三个参数组成:通信的目的IP地址,使用的传输层协议,使用的端口号。创建一个套接字就是为客户端提供一个可以通信的接口。实现代码如下:boolCSocketCo11fi:CreateSocket(LPCTSTRStrSeruiceNane,intnProtocol,intnType,UINTUOptions*=0*)<如果已经打开,则返回falseif(Ispen()returnFalse;SOCKADDR_INSockAddr=<0>;地址设定SOCKETsock=socket(nProtocol,nType,O);if(INUALID_SOCKET?=sock)<SockAddr.sin-port=htons(GetPortNuber(StrSeruiceName);if(0?=SockAddr.sin_port)<SockAddr.sin_addr.s-addr=htonl(INADDRANV);SockAddr.sin_family=nProtocol;if(UOptions&SO-REUSEADDR)设定相关选项BOOLoptual=TRUE;if(SoCKET_ERROR=setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&optualvsizeof(BOOL)<closesocket(sock);returnFalse;>3 .关闭套接字。当服务器断开或客户端断开服务器时则关闭套接字,不再传输任何信息。代码如下:uoidCSocketCoRn:CloseConn()<if(IsOpenO)<调用ShUt(IOwnCOnneCtiOn关闭ShutdounConnection(SOCKET)nhCon);m_hConn=INUfiLID_HfiNDLE_UALUE;mbBroadcast=False;4 .数据读入,把客户端输入的信息传入服务器端进行转发。实现代码如下:读入数据DWORDCSocketConm:ReadConn(LPBYTEIpBuffer,PWORDdwSize,DWORDduTieout)-ASSERTE(Ispen();SSERTE(IpBufFer!=HULL);if(IpBuFfer=NULLdwSize<1L)return0L;Fd_setfdRead=<8;TIMEUALStTime;TIMEUAL*pstTine三NULL;if(INFINITEdwTineout)StTime.tusec=O;StTime.tuusec=dwTieout*1000;pstTime=RstTime;SOCKETs=(SOCKET)m_hConn;设定描述符一if(?FD_ISSET(s,&FdRead)FD_SET(s,&FdRead);选择函数,设定超时时间DVJORDdUBytesRead=0L;intres=select(s+1f&FdReadvNULL,NULL,pstTime);if(res>O)<if(IsBroadcastOIsSnartAddressingO)SOCKADDR_INSockAddr=<>/获得地址intnOFFset=IsSnartAddressingO?SizeoF(SockAddr):O;intnLen=SizeoF(SockAddr);if(dwSize<(DWORD)nLen)/缓冲区太小<SetLastError(ERROR_INUfiLID_USER_BUFFER);return-1L;力获得数据res=recuFron(s,(LPSTR)61pBuFFernOFFset,duSize,0,(LPSOCKHDDR)&sockAddr,&nLen);/clear,sin-zero,wewillignorethenwith'SockAddrIn1anyway?meset(sockAddr.sinzero,O,sizeof(sockAddr.sin-zero);5 .发送数据。对于从客户端口传来的数据,根据传输层的协议选择对点转发或者广播进行发送。如果是TCP协议则不进行广播,只需要保存socket,保证连接存在和数据到达的准确性。如果UDP连接则进行广播,需要互斥操作,防止同一时间不同的UDP广播。实现代码如下:发送数据DWORDCSocketConm:WriteConn(constLPBVTEIpBuffer,DWORDdwCountvDWORDdwTimeout)(_ASSERTE(Ispen();二ASSERTE(NULL?=IpBuFFer);如果没有建立连接或者缓冲区为空,则返回if(IsOpen()NULL=IpBuFFer)return0L;/Fd_set是一个结构体,可以被很多的Win(I(H后soCket函数使用,4Qselect,在SOCket2.G中使用/ZtypedeFstructFdset/uintFd_count;/数量/SOCKETfd二arrayFD_SETSI2E;/socket数组/Fd_set;Fd_setFdWrite=0;TIMEUALStTime;TIMEUAL*pstTime=NULL;if(INFINITE?=dwTineout)StTine.tu_sec=0;StTime.tu-usec=dwTimeout*10O0;pstTine=6stTine;SOCKETs=(SOCKET)LhCOmln;设定描述符if<?FD_ISSET(s,RFdWrite)FD_SET(s,&FdWrite);选择函数设定超时时间DWORDdWBytesWritten=OL;intres=select(ST,NULL,ftfdWrite,NULL,pstTine);if(res>O)/发送消息广播或者点对点发送if(IsBroadcastO11IsSmartAddressingO)</useoffsetForSmartaddressingintnOFfset=IsSartAddressinq()?sizeoF(SOCKADDRIN):O;if(IsSniartAddressingO)<if(dWCount<sizeof(SOCKfiDDR_IN)/error-buffertosmall<SetLastError(ERROR_INUALID_USER_BUFFER);return-1L;从缓冲区中获得地址SockAddrInSockAddr;sockAddr.SetAddr(SOCKADDR_IN*)IpBuFfer);获得地址然后发送if(sockAddr.SockAddrIn.sin_addr.s_addr=htonl(INADDR_BROfiDCAST)<res=sendto(s,(LPCSTR)61pBuFfernOFfset,dwCount-nOfFset,O(LPSOCKADDR)SockAddr,SockAddr.Size();dwBytesWritten=(DWORD)(res>=0)7(res):(-1);returndwBytesWritten;姬糜吃辑住地址列表CSockAddrList:Ziteratoriter=n_AddrList.begin();For(;iter?=n_AddrList.end();)循环发送信息res=sendto(s,(LPCSTR)lpBuffernOffset,dwCount-nOfFset,0,(LPSOCKADDR)(*iter)viter->Size();if(res<O)CSockAddrList:!iteratordeladdr=iter;+iter;/下一个mfiddrList.erase(deladdr);>else+iter;/下一个>UnlockListO;/解锁UDP总是返回trueres=(int)dwCount-nOFFset;else发送到单个客户端res=send(s,(LPCSTR)IpBuFfer,duCount,0);GwBytesWritten=(DWoRD)(res>=0)?(res):(-1);returndwBytesWritten;6 .数据显示。将数据信息在服务器端显示出来。实现代码如下:显示数据uoidCSocketManager:ZDisplayData(constLPBVTEIpData,DWORDduCount,constSockAddrIn&SfrOm)(CStringStrData;nei)cpy(StrData.GetBuFFer(dwCount),A2CT(LPSTR)lpData),dwCount);StrData-ReleaseBuFFerO;如果sfru坏为空if(!sFrom.IsNull()<LONGuAddr=sFron.GetIPAddr();BVTE*SAddr=(BVTE*)&uAddr;shortnPort=ntohs(sFron.GetPort();/显示端口CStringStrAddr;地址以网络形式保存StrAddr.Format(T("%u.¾uuu(%d)>,i),(INT)(sAddrO)v(UINT)(sAddr1),(UINT)(sfiddr2),(UINT)(sAddr3),nPort);得到来源和数据StrData=StrAddr÷StrData;写入信息AppendMessageCStrData);>7 .5.5实现界面功能按钮控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态,要实现控件的功能还需要对其添加消息处理函数。服务器的界面主要有6个功能按钮:令SoCket类型:选择TCP或UDP协议。令服务器端口:设置服务器端口。令启动:单击该按钮,则启动服务器以提供C/S模式系统的服务。令停止:单击该按钮,则停止服务器断开连接,不再提供通信服务。令发送:单击该按钮,则在服务器端向全部在线用户广播一条消息。令退出:退出服务器系统。8 .5.6测试测试时选择TCP连接方式,并单击“启动”按钮,可以得到的运行结果如图1.6所示。图1.6服务器运行结果3.6客户端应用程序3.6.1 界面设计主要功能是连接服务器地址和端口,选择socket类型和填写登录的用户名。界面设计如图1.7所示。图1.7客户端应用程序界面设计3.6.2 控件的编辑与绑定控件的编辑与绑定如下表1.8所示。表1.8编辑框控件和变量绑定编辑控件的内容ID类型变量名服务器端口IDC_EDITPORTCStringm_strPort聊天记录IDC_EDIT_MSGRERCEitm_ctrlMSgRecord发送消息IDC_EDIT_MSGCEitm_ctrlMsg端口微调控件IDC_SPINPORTCSpinButtonCtrlm_ctrlSpinPort服务器地址IdcjpaddresssvrCIPAddressCtrIm_ctrlIPAddr登录用户名IDC_EDIT_USERNAMECEitM_strUserName3.6.3 定义类设计和实现类设计中的函数客户端主要用于连接服务器,登录用户名后进行通信。所以在本项目中客户端的主要功能封装在两个类中:令CSOCketComm类:该类负责网络连接,信息转发。令CSoCketManager类:该类负责端口的管理。3.6.4 实现界面功能按钮客户机端的界面主要有3个功能按钮: SOCket类型:选择连接方式TCP或UDP。 连接服务器:单击该按钮,则自动搜索局域网内的服务器,如果有,则连接成功,可以进行下一步通信操作。否则连接失败。 断开服务器:单击该按钮,则停止发送断开服务器的信号传给服务器,告知服务器本地己经放弃连接。 发送:单击该按钮,则向服务器端发送一条信息,这条信息的转发则由服务器负责。 退出:退出客户端系统。3.6.5 测试在启动客户端程序之前,先保证ChatServer应用程序已经启动。具体操作步骤如下:1)启动服务器端程序,并将服务器端的SOCket类型设置成为UDP或TCP模式,端口5000(默认值)。2)启动客户端,选择SoCket类型为UDP模式,登录名为朵朵,端口默认5000,然后单击“连接服务器二3)启动客户端,选择SOCket类型为UDP模式,登录名为笑笑,端口默认5000,然后单击“连接服务器二4)在两个客户端分别输入聊天信息,观察两客户端“聊天记录”编辑框和服务器端的“聊天记录”编辑框的信息变化。其中一个客户端的运行效果如图1.9如示。ChatCIient聊天服分器设置服芬器湍口:Zj服务器地址:I192.1681101SoCket类型:CTCPCUDP连接“务器I关于 I断开服务器I网站101, Port: -1673fOeeee SllllZNKNK丽NK re也KIHIHI CTTTTI采菱笑 d:呆房笑发送信息:发送登陆用户名:医厂聊天记录:图1.9客户端运行效果此时,服务器运行界面运行效果如图1.10所示。男ChatServerS。Cket类田%务器湍口:三±UTCP.¾DP启动I停止I关于I聊天记录:192 168.1 101192.168. 1.101192 168.1.101192.168. 1.101服务器:Ienovo-TKIHKz1P地址:192.168.1.101运(-1673)>lnovo-TKIMK采采说:飞(-1673)>lenovo-THINK笑片说:f(-11526)>lnovo-TKINK柴生说:(-1673)>lenovo-TKINK笑笑说:发送消息