版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XUCHANGUNIVERSITY本科生课程设计即时通信系统院系计算机科学与技术学院专业计算机科学与技术班级学号学生姓名指导教师职称讲师2011年12月独创性声明本人郑重声明:所呈交的课程设计论文(设计)是本人在指导老师指导下取得的研究成果。除了文中特别加以注释和致谢的地方外,论文(设计)中不包含其他人已经发表或撰写的研究成果。与本研究成果相关的所有人所做出的任何贡献均已在论文(设计)中作了明确的说明并表示了谢意。签名:年—月—日授权声明本人完全了解许昌学院有关保留、使用本科生课程设计论文(设计)的规定,即:有权保留并向国家有关部门或机构送交课程设计论文(设计)的复印件和磁盘,允许课程设计论文(设计)被查阅和借阅。本人授权许昌学院可以将课程设计论文(设计)的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编论文(设计)。本人论文(设计)中有原创性数据需要保密的部分为:。签名:年—月—日指导教师签名:年—月—日摘要本文介绍了即时通信系统的程序设计和功能实现。该系统主要是基于TCP与UDP的C/S模式通信系统。该项目由两个主程序组成:服务器端应用程序,客户机端应用程序。服务器启动监听进程,监听连接申请,对于来申请的客户机,或者说申请的ID,服务器进程将会对进行判别和分类,满足服务器要求就进行连接,从而实现客户端的通信。该系统界面友好,操作简单,适应性强,扩展性强。关键字:即时通信;服务器;客户端;ABSTRACTThispaperintroducestheInstantMessagingsystemsprogramdesignandfunctionrealization.ThesystemismainlybasedonTCPandUDPC/Smodecommunicationsystem.Theprojectconsistsoftwomainprogramcomposition:theserverapplication,theclientapplication.Monitorprocessserverstartup,monitorconnectionapplication,toapplyfortheclient,orapplyforID,theserverprocesswillbetodiscriminationandclassification,andsatisfytherequirementswillconnectserver,soastorealizetheclientcommunication.Thesystemfriendlyinterface,simpleoperation,strongadaptabilityandexpandability.Keyword:InstantMessaging;Theserver.Theclient;目录TOC\o"1-5"\h\z目录4第1章引言61.1概述61.2研究背景61.3系统简介61.4系统开发方法6第2章系统分析7可行性分析7功能分析7第3章系统设计与实现93.1项目系统模型93.2开发及运行环境93.3系统结构设计93.4系统功能设计103.5服务器端应用程序123.5.1服务器端应用程序的创建流程123.5.2实现界面设计123.5.3定义类设计13实现类中的函数15实现界面功能按钮223.5.6测试233.6客户端应用程序233.6.1界面设计23控件的编辑与绑定243.6.3定义类设计和实现类设计中的函数243.6.4实现界面功能按钮253.6.5测试25第4章系统结构274.1服务器端结构27客户端结构27第5章系统评价29结束语30致谢31附录参考文献32#1.1概述即时通信(InstantMessaging)是基于互联网协议的应用程序,它能够使应用不同类型设备的用户一对一进行通信。IM最传统的形式是聊天,聊天即双方互相传送信息。与电子邮件服务相比,聊天服务更具有实时性,更便于人们相互沟通和交流信息。而套接字是通信双方一种相互约定的通信方式和规则,在TCP/IP通信中一般使用套接字的相关函数接口来完成通信过程。区分不同应用程序进程间的网络通信和连接,主要有三个通信的目的IP地址,使用的传输层协议,使用的端口号。通过这三种参数就可以识别客户端双方的身份进行可以放心的通信。本系统在此基础上设计的一个简单的通信系统。1.2研究背景随着互联网的发展,聊天服务已成为必不可少的互联网服务之一,它方便远距离人们的信息的交流,简单易操作,又保证的即时性,使人们更能享受互联网带来的好处。典型的IM是样工作的:当好友列表中的某人在任何时候登录上线并试图通过用户怕计算机联系用户时,IM系统会发一个消息提醒用户,然后用户能与对方建立一个聊天会话界面并键入消息文字进得交流。自1999年,腾讯公司自主开发了基于Internet即时通信网络工具—腾讯即时通信(QQ),其合理的设计,良好的易用性,强大的功能,稳定高效的系统运行,赢得了用户的青睐。与电子邮件服务相比,聊天服务具有实时性,人们更便于相互沟通,交流思想和信息。所以即时通信系统已成为人们研究的热点。1.3系统简介该系统是基于客户机/服务器(Client/Server)模式的聊天室系统,此设计采取监听对话模型。基本思路是:服务器启动监听进程,监听连接申请,对于来申请的客户机,或者是申请的ID,服务器进程将会对其判别与分类,满足服务器要求进行连接。1.4系统开发方法本系统是利用VisualC++6.0这个集成开发环境设计并实现一个基于C/S模型的聊天室。1.该系统是使用MFC库开发基于对话框形式的网络聊天室系统。MFC库可以开发内容和功能都非常丰富的Windows程序,但万变不离其中,都是围绕着MFC(即继承MFC类进行开发)库实现的。MFC类家族很庞大,但有几个是程序运行必备的类:CObject类:该类完成动态空间的分配与回收。CCmdTarget类:CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息的发送,等待和派遣工作,实现应用程序的对象之间的协调运行。CWinApp类:CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CDocument类:CDocument类是文档类,包含了应用程序在运行期间所用到的数据。CWnd类:CWnd类是一个通用窗口类,用来提供Windows中所有通用特性。CView类:CView类是用于让用户通过窗口来访问文档以用负责文档内容的显示。CFrameWnd类:是CWnd的派生,并实现了标准的框架应用程序。CDialog类:CDialog类用来控制对话框窗口,并选择从CDialog类继承。2.VC++提供了多种对网络编程的支持,主要有Socket支持,WinInet支持,MAPIT和ISAPI支持等。WindowsSocketsAPI是Win32API的一个子集,是在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/Windows2000/Win7开发工具包:VisualC++6.03.3系统结构设计
该系统是基于客户机/服务器(Client/Server)模式的聊天室系统,此设计米取监听对话模型。基本思路是:服务器启动监听进程,监听连接申请,对于来申请的客户机,或者是申请的ID,服务器进程将会对其判别与分类,满足服务器要求进行连接。连接后,客户机端用户就可以进行通信了。系统框架图如图1.2所示。启动监昕进程咸息幵蔦互!连功&始喜广机启动监昕进程咸息幵蔦互!连功&始喜广机图1.2聊天室的C/S模型设计框架3.4系统功能设计实现基于对话框的网络聊天通信则需要实现以下几个功能:1)建立通信框架首先利用MFCAppWizard生成系统框架:在VisualC++6.0的IDE的环境下选择FilelNewIProjectIMFCAppWizard(exe)IProjectNamelOK|NEXT|WindowSockets|Finish按钮,选择OK按钮,应用程序的框架就将自动创建。之后增加控件对象,布置程序的主对话框,通信框架就建立成功了。网络连接类CsocketComm该类的定义和实现,完成了C/S模型的连接处理,也就是所谓的”信道通信”部分。由于本系统集成TCP和UDP的聊天程序,所以在系统中有所区别.主要实现的接口功能包括:创建服务器端socket,获取主机IP,获取服务器端口号,获取本地地址,获取主机名字,数据接收,发送,以及关闭通信等。创建服务器Server首先需要创建Socket,在函数CreateSocket()中创建Socket,由于传输中有TCP和UDP两种方式,函数CreateSocket()中根据传递过来的参数nType的值对这两种不同的传输方式进行选择,该函数不管TCP还是UDP连接,都是通用的。当nType=SOCK_DGRAM时为UDP;当nType=SOCK_STREAM时为TCP。有所区别的是,在UDP中如时要进行广播,需要进行互斥操作,防止同一时间不同的UDP广播;在TCP连接模式中,没有UDP传输模式中的广播模式,但是在TCP连接需要保存socket,保证连接的存在和数据到达的准确性。服务器的主要功能包括启动服务器,更新服务器、关闭服务器、发送与接收信息,以及设定相关选项。创建客户机Client客户机的创建和服务器的创建同等重要,都是通信的实体。客户端通过函数ConnectTO来进行连接申请,首先判断Socket是否已连接,如果创建就返回false,否则就创建Socket。创建好Socket之后和本地地址绑定,再获取远程服务器的地址和端口号,确定好服务器,就调用Connect。将客户机连接到服务器。UDP中多用户聊天的实现首先,服务器创建UDP类型的套接字并绑定服务端口,并使得该套接字处于未连接状态;接下来就循环读取来自客户机的请求,将其地址保存起来,写入地址表m_AddList。服务器端接收客户机发送过来的数据时,先判断缓冲区是否够大,足够大刚写入缓冲区;向客户机发送数据时,通过广播的形式,先锁定地址列表LockList(),然后通过for循环语句,对地址列表中的每个地址通过函数sendto()发送数据到客户机。期间,若某客户机与服务器断开连接,刚从地址列表中删除其地址信息,之后将不再发送数据。6)退出系统当客户端选择退出系统时,则断开与服务器的连接,不开转发其信息3.5服务器端应用程序3.5.1服务器端应用程序的创建流程创建流程如下:实现界面设计实现界面设计不仅仅是设计一个界面,还需要对界面的控件名称和控件绑定的变量进行定义。(1)界面设计服务器的对话框界面如图1.3所示。
图1.3服务器端应用程序界面设计(2)编辑控件与变量绑定设置界面中的3个编辑框的ID和与之绑定的变量,如表1.4所示。表1.4编辑框控件和变量的绑定编辑控件的内容ID类型变量名服务器端口IDC_EDIT_PORTCStringm_strPort聊天记录IDC_EDIT_MSGRERCEditM_ctrlMsgRecord发送消息IDC_EDIT_MSGCEditM_ctrlMsg端口微调控件IDC_SPINPORTCSpinButtonCtrlM_ctrlSpinPort3.5.3定义类设计服务器有2个基本功能:聊天记录的转发、端口管理。将这两个功能封装在两个类中:CSocketComm类:该类负责网络连接,信息转发等。CSocketManager类:该类负责端口的管理。CSocketComm类中的主要函数功能:
staticSOCKETWaitForConnection(SOCKETsock);等待新的连接。staticboolShutdownConnection(SOCKETsock);关闭连接。staticUSHORTGetPortNumber(LPCTSTRstrServiceName);获得服务端口号。staticULONGGetIPAddress(LPCTSTRstrHostName);获得主机IP地址。staticboolGetLocalName(LPTSTRstrName,UINTnSize);获得机器名。staticboolGetLocalAddress(LPTSTRstrAddress,UINTnSize);获得本地地址。CSocketComm类代码如下:classCSocketComni<public:CSocketConn();boolIw叩boolIw叩Enf】const;H判折socket怎否王确boolIsStartOconst;//线養是否启訪boollsBroadcast()const;//是否允许UDF广播boolIsSmartfiddressingOconst;H(sSmartAddressingmodesupportSOCKETGetSocket()const;//返回mocliEt句柄voidboolboolvoidvoidvoidboolvoidSetSnartAddressing(boolbSmartAddressing);//SetSmartaddressingmodeGetSockHairie(SockAddrIn&saddrin);//苑得socket名即地址voidboolboolvoidvoidvoidboolvoidGetPeerName(SockAddrln&saddrin);//济导PeefSocket爷-地址AddlcList(constSockFlddrln^saddr_in);力爲地扯增才庠〔歹愫Re[noveFroinList(constSDDkAddr(n&saddrin);//j麻〔衰口删除列衰CloseComniO;//丢习SocketIFatchCoinnO;//启幻Socket线趕Mt叩CommO;//停止Socket攥呈//创建旅芬羞茁血上boolCreateSocket(LPCTSTREtrSeruiceName,intnProtocol,intnlijpe,UINTuDptions=9);H事件处理函数-接收数据virtualvoidOnDataReceiuBd(constLPBYTElpBuFFer,OUORDdwCount);virtualvoidOnEuent(UIKTuEuent);H主线程函数virtualvoidRun();CSocketManager类中的主要函数如下:virtualvoidOnDataReceived(constLPBYTElpBuffer,DWORDdwCount);接收数据voidDisplayData(constLPBYTElpData,DWORDdwCount,constSockAddrIn&sfrom);显示数据CSocketManager类代码如下classCSocketManager:publicCSocketCommpublic:CSocketManager();uirtual**CSocketHanager();voidSetblessageWindow(CEdit*pMsgCtrl];voidfippendMessagefLPCTSTRstrText);public:uirtualvoidOnDataR?ceijed(constLPBVTElpBufferpDUORDduCount):uirtualvoidCnEuent[HINTuEvent);protected:voidDisplayDatafconEtLPBVTElpData,DWORDduCount,constSockAddrIntsFron);CEdit*mpMsgCtrl;打_3.5.4实现类中的函数CSocketComm类主要实现5个功能:获取本机地址、创建套接字、关闭套接字、数据读入、数据发送。CSocketManager类实现数据显示。开发流程如下:获取本地计算机机器名及IP地址。获取本地计算机机器名及IP地址及端口号,为了区分不同的应用进程和连接事务,用于本地计算机用户进行通信。实现代码如下:"获得本地机器名boolCSocketComm::GetLocalNane(LPTSTRstrNane,UINTnSize)if(strNameNULL&&nSize>0)charstrHost[HOSTNAME_SIZE]={B};//获得机器名iF(SOCKETERROR!=gethostname(strHost,sizeof(strHost)))<_structhostent*hp;|hp二gethostbyname(strHost);if(hp?=NJLL){5trcpy(strHost,hp->h_nane):}_//检查缓冲区大小if[strlen(strHost)>nSize){SetLastError(ERRORINSUFFICIENTBUFFER);returnfalse;"获取本地计算机的标准IP地址,^"127.0.0.flboolCSocketComn::GetLocalAddress(LPTSTRstrAddress,UINTnSize){//获得计算机本地地址if(strAddress*=NULL除nSize>町{char5trHo5t[H0STNAME_SIZE]={B};//获得机器名if(SOCKETERROR?=gethostnane(strHost,5izeoF(5trHo5t)))<_structhostent*hp;hp=getho5tbyname(5trHo5t);if(hp!=HULL除hp->h_addr_list[0]!=HULL){//查看地址是否是畔节犬小if(hp->h_length<即)
returnFalse;//转化地址到点strHost[0]=6;//创建地址字符创sprintf(strHost,■■盅u.%u.%u•塔lT,(UINT)(((PBYTE)hp->h_addr_list[0]>[0]),(UINT)(((PBYTE)hp->h_addr_list[(UINT)(((PBVTE)hp->h_addr_list[B])[2]),(UINT)(((PBVTE)hp->h2add^li5t[0]>[3]));//检查缓神区是否足够if(strler(strHost)>nSize)SetLastErrorfERROfi」NgUFFMIENT」UF庄R);returnfal^e;HUnicode转换lifdefIHICOCEreturn(B*=HultiBijte7cWideChar(CP_ACP,fl,strHost,-1,strAddress,rSize5NULL,NULL));-(elsetcscp^tstrfiddress,strHost);returntrue;tendif}}SetLa5tError(ERR0R_INUflLID_PflRflHETER);returnfalse;}创建套接字。套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。套接字主要有三个参数组成:通信的目的IP地址,使用的传输层协议,使用的端口号。创建一个套接字就是为客户端提供一个可以通信的接口。实现代码如下:boolCSocketComm::CreateSocket(LPCTSTRstrSeruiceN^me,intnProtocol,intnType,UINTuOptions/*=B*/)<"如果已经打开,则返回FMhifCI切卩町())returnFalse;SOCKADDRINsockAddr={B"地址设定SOCKETsock=socket(nProtocol,nType,0);if(INUftLIDSOCKET?=sock)<_sockAddr.sin_port=htons(GetPortNumber(strSeruiceName));iFC0!=sockAddr.sin_port){_sockAddr.sinaddr.saddr=htonlfINfiDDRfiN?):sockAddr.sin_Faniily=nProtocol;if(uOptions&SOREUSEADDR)'"设定相关选顶BOOLoptual=TRUE;if(SOCKETERROR==setsocl<opt(sock,SOLSOCKET,SO_REU£EfiDDR,|(char*)Koptual,sizpof?BOOL))){_cloEesocket(sock);returnFalse;关闭套接字。当服务器断开或客户端断开服务器时则关闭套接字,不再传输任何信息。代码如下:voidCSocketConn::CloseConn()<if(IsOpenfn<…打调用ShutdounConnection^闭ShutdounConnection((SOCKET)ni_hComm)-mhComm=INVALIDHANDLEUftLUE;mbBroadcjst=False;数据读入,把客户端输入的信息传入服务器端进行转发。实现代码如下:"诵入数据DUORDCSocketComm::ReadCoinin(LPBVTElpBuFFer,pWDRDduSize,DWORDduiTinieDut)_fiSSERTE(IsOpen());2fiSSERTE(lpBuffer?=HULL);if(lpBuffer==HULL||d^Size<1L)returnCL;fd_setFdRead={9};TIMEVALstTine;TIMEVAL*pstTine=HULL;if(INFINITE!=duTimeout){stTine・tv_5BG=0;stTine=dvjTimeout*1000;pstTine=&stTine;SOCKET5=(SOCKET)OConn;H设定描述桔if(?FD_ISSET(5,&FdRead))FD_SET(5,&FdRead);"选择函数,设定超时时间DUORDduBjjtesRead=OL;intres=select(s+1,&FdRead,NULL,NULL,pstTime):if(res>0)<if(IsBroadcast()||IsSmartAddressingf))<SOCKADDR_INsockAddr={0>;//菇彳昂土也址iritnOFFset=I^SmartAddres^ingf)?sizeoF(sockAddr):Q;iritnLen=^izeaffsackAddr);iF(dwSize<(DU0RD>nLen>ff缓冲区太小<SetLastErrorfERRaR_IHUALID_USER_BUFFER);return-1L;>"获得数据res=recuFromfsr(LPSTR)&lpBuFFer[nOFFset],dwSize,|乩(LPSOCKADDR>&sockAddr,&nLon);//clear'sin_zero',u?willignorethemwith'Sockfiddrin'anyway!nensptf&sockAddr-sinzero,叫sizeoFCsockfiddr-sinzero));发送数据。对于从客户端口传来的数据,根据传输层的协议选择对点转发或者广播进行发送。如果是TCP协议则不进行广播,只需要保存socket,保证连接存在和数据到达的准确性。如果UDP连接则进行广播,需要互斥操作,防止同一时间不同的UDP广播。实现代码如下:〃发送数据DUORDCSockPtConini::UriteConnn(constLPBYTElpBuffer,DUORDduCount„DUORDdwTimeout)<_ft££ERTE(I^OppnO);2ftS£ERTE(NULL•=lpBuFFer);"如果没有建立连接或者缓冲区为空,则返回iF(?IsOpen()||NULL==LpBuFFer)returnBL;//Fd_set是一个结构体‘可以.被很多的windowssocket函数使用,//^Dselect,在socketa.O中使甬//typedeFstructFdset{"uintFdGount;ff数量//SOCKETFd_array[FO_SETSIZE];//socket数纟目Fd_set;——Fd_sptFdWrite=<B>;TIMEUftLstTine;TIMEUftL*pstTinp二NULL;iF(INFINITE•=duTimeout>{5tTim&.tuusec=duTimeout*1000;pstTime=&stTime;SOCKETs=(SOCKET)m_hConm;"设定掃述特if(?FD_ISSET(s,&fdWrite))FD_SET(s,ftFdWrite);//选择函数设定超时时间DUORDdwBytesWritten=0L;intres=select!s+l,null,ftl-dWrite,null,pstlime);iF(res>O)<//发送消息广措或者点对点发送iF(IsBroadcast()||IsSnartAddressingO)<HuseoffsetfurSmartaddressingintnDFFset=IsSmartAddrBSsinqf)?sizeoF(SOCKADDR_IN):0:if(IsSmartAddressing())if(duiCount<sizeofCSOCKADDR」N))//error-buffertosmallSetLastError(ERROR」NUALID_U医R_BUFFER);return-1L;>//从缓神区中获得地址SockAddrInsockAddr;sockAddr.SetAddr((SOCKADDR_IN*)lpBuFFer);//荻得地址然后发送if(sockftddr.sockAddrln.sin_addr.s_addr?=htonl(INADDR_BROADCAST))<res=5endto(s,(LPCSTR)&lpBuFfer[nOffset],dwCount-nOfFset,O,(LPSOCKADDR)sockAddr,sockAddr.Sizef));dwBytesWritten=(DUORD)((res>=B)?(res):(-1));returndwBytesWritten;伫即潟地址列表CSockAddrList::iteratoriter=nfiddMList.begin();For(;iter•=m_fiddrList.end();)<打循坏发送信息res=sendto(5,(LPCSTR)&lpBufFer[nOFf5et],dwCount-nQffset,|o,(LPSOCK口DDR)(*itEF),iter->Size());If(res<0)CSockAddrLi^t::it&ratordaladdr=iter;++iter;//下一个m_fiddrList.erase(deladdr);}_else++iter;//下一个}UnlockList();//解锁//UDP总是返回truEres=(int)duiCount-nQffset;G1SG"发送到单个客户端res=send(5,(LPC£TR)LpBuFFer,duCount,Q):dwBj|te5Written=(DUORD)((res>=0)?(res):(-1));}returnduBj/tesUritten;数据显示。将数据信息在服务器端显示出来。实现代码如下:打显示数据voidCSocketManager::Di5playData(constLFBYTElpData,DWORDduCount,constSockAddrIn&sfron)<CStringstrData;memcpyfstrData.GetBuffer(dwCount),^2CT((LPSTR)lpData),duCount);strData.ReleaseBuffer();〃如ftsfroivf;为空if(*sfrom.IsNull())<LONGuAddr=sfrom.GetIPAddr();BVTE*sAddr二(BYTE*)&uflddr;shortnPort=ntohs(sfrom.GetPort());//显示丈帯口CStringstrAddr;“地址以网络形式保存strAddr.Format(_T「■玄u.%u.%u.^u(^d)>"),(UINT)(sAddr[O]),(UINT)(sfiddr[1]),(UINT)(sfiddr[2]),(UINT)(5fiddr[3]),nPort);〃得到来源和数据strData=strAddr+;}/丿写入信息AppendMessagefstrData);}3.5.5实现界面功能按钮控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态,要实现控件的功能还需要对其添加消息处理函数。服务器的界面主要有6个功能按钮:Socket类型:选择TCP或UDP协议。服务器端口:设置服务器端口。◊启动:单击该按钮,则启动服务器以提供C/S模式系统的服务。◊停止:单击该按钮,则停止服务器断开连接,不再提供通信服务。◊发送:单击该按钮,则在服务器端向全部在线用户广播一条消息。◊退出:退出服务器系统。
3.5.6测试测试时选择TCP连接方式,并单击“启动”按钮,可以得到的运行结果如图1.6所示。图1.6服务器运行结果3・6客户端应用程序3.6.1界面设计主要功能是连接服务器地址和端口,选择socket类型和填写登录的用户名。界面设计如图1.7所示。ChatClientI亘…聊夬瞬器设置服务器端口:1编辑朋务器地址:1.连接服劳器丨关于丨CTCPCUDF斷开册努器阿站1登陆用户容:|编辑聊天记录:岌送信息:11^退出1图1.7客户端应用程序界面设计3.6.2控件的编辑与绑定控件的编辑与绑定如下表1.8所示。表1.8编辑框控件和变量绑定编辑控件的内容ID类型变量名服务器端口IDC_EDITPORTCStringm_strPort聊天记录IDC_EDIT_MSGRERCEitm_ctrlMsgRecord发送消息IDC_EDIT_MSGCEitm_ctrlMsg端口微调控件IDC_SPINPORTCSpinButtonCtrlm_ctrlSpinPort服务器地址IDC_IPADDRESSSVRCIPAddressCtrlm_ctrlIPAddr登录用户名IDC_EDIT_USERNAMECEitM_strUserName3.6.3定义类设计和实现类设计中的函数客户端主要用于连接服务器,登录用户名后进行通信。所以在本项目中客户
端的主要功能封装在两个类中:CSocketComm类:该类负责网络连接,信息转发。CSocketManager类:该类负责端口的管理。3.6.4实现界面功能按钮客户机端的界面主要有3个功能按钮:Socket类型:选择连接方式TCP或UDP。连接服务器:单击该按钮,则自动搜索局域网内的服务器,如果有,则连接成功,可以进行下一步通信操作。否则连接失败。断开服务器:单击该按钮,则停止发送断开服务器的信号传给服务器,告知服务器本地已经放弃连接。发送:单击该按钮,则向服务器端发送一条信息,这条信息的转发则由服务器负责。退出:退出客户端系统。测试在启动客户端程序之前,先保证ChatServer应用程序已经启动。具体操作步骤如下:启动服务器端程序,并将服务器端的Socket类型设置成为UDP或TCP模式,端口5000(默认值)。启动客
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 预防校园欺凌主题班会模板
- 铁路信号基础
- 2026福建紫金矿冶测试技术有限公司人才社会招聘15人笔试备考试题及答案解析
- 2026年鼎和财产保险股份有限公司人员招聘考试模拟试题及答案
- 2026绵阳科技城发展投资(集团)有限公司招聘组织绩效等岗位人员11人考试参考题库及答案解析
- 2026云南昆明市延安医院面向社会招聘见习人员笔试参考题库及答案解析
- 2026年黑龙江中盟集团有限公司人员招聘考试模拟试题及答案
- 2026年甘肃财贸职业学院考核引进博士研究生14人考试备考题库及答案解析
- 2026延安大学咸阳医院护士招聘60人笔试备考题库及答案解析
- 2026广西南宁市江南区沙井卫生院招聘编外人员1人笔试备考题库及答案解析
- 本科经济学专业《计量经济学》教学设计(庞皓教材适用)
- 盆底重建手术护理要点
- DB6501∕T 080-2025 牛羊杂清洗规范
- 高考语文复习微专题之文言文游记类散文
- 泰森多边形课件
- T/CNSS 030-2024蛋白棒、能量棒和膳食纤维棒
- T/CECCEDA 1-2025企业管理创新体系要求及实施指南
- 资金统借统还管理办法
- 新编经济法教程
- 项目七婴幼儿道路交通伤害预防与处理姚丽娇课件
- 江苏省苏州市六区联考2024-2025学年八年级上学期期末考试物理试题(含答案)
评论
0/150
提交评论