版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[信息与通信]基于C的局域网通信工具的设计与实现(完整版)(文档可以直接使用,也可根据实际需要修改使用,可编辑欢迎下载)
学号:[信息与通信]基于C的局域网通信工具的设计与实现(完整版)(文档可以直接使用,也可根据实际需要修改使用,可编辑欢迎下载)本科生毕业论文论文题目:基于C#的局域网通信工具的设计与实现作者:专业班级:指导教师:2011年4月15日摘要分析了目前网络通信系统的现状与不足,设计了一个基于TCP/IP的局域网聊天工具。从Socket入手,实现了面向连接的用户与服务器间点对点异步通信,在此基础上应用了多线程技术,使网络服务器具有了多用户间数据转发的功能,进而解决了局域网多用户间的通信问题。聊天程序分服务器和客户端程序两部分,以VisualStudio2005为基本开发环境和C#语言进行编码设计,实验表明该聊天工具能够为局域网内部员工提供一个很好的交流平台,方便了工作上的交流与协同。本课题开发了一个机遇局域网内部的消息通讯平台。在此平台上可以实现内部用户之间的实时通讯,使用户之间能更及时、更方便有效的沟通信息。实现了局域网内部电子信息化的交流,提高了工作效率。本系统有如下功能:1、用户注册及修改信息:可以申请自己的账号以及修改自己的信息。2、信息的接受和发送功能:包括文字信息以及图像信息。3、查找添加好友功能:能够通过用户名查找到相对应的用户以及添加其为自己的好友请求。4、聊天记录查看功能:能够查看与用户进行聊天的文字记录,从数据库获得。关键词:数据库Socket软件工程局域网AbstractAnalysisofthecurrentnetworkstatusandlackofcommunicationsystem,designedbasedonTCP/IPLANchattool.StartingfromtheSockettorealizetheuserandtheserverconnection-orientedasynchronouscommunicationbetweenthepointtopoint,onthisbasis,theapplicationofmulti-threadingtechnology,thenetworkserverhasanumberofdataforwardingfunctionsbetweenusers,andthensolvedthemulti-userinter-LANcommunicationproblems.Chatprogramsub-serverandclientprogramintwopartstothebasicVisualStudio2005developmentenvironmentandC#languageforcodingdesign,experimentsshowthatthelocalareanetworkchattoolcanprovideagoodinternalstaffcommunicationplatform,facilitatingtheexchangeofworkandcollaboration.Thistopichasdevelopedanopportunityforthenewsofthelocalareanetworkcommunicationplatform.Canbeachievedonthisplatformreal-timecommunicationbetweeninternalusers,souserscanbemoretimely,moreconvenientandeffectivecommunicationofinformation.AchievedwithintheLANexchangeofelectronicinformationandimproveefficiency.Thissystemhasthefollowingfunctions:andmodifyuserregistrationinformation:Youcanapplyfortheirownaccountandmodifytheirowninformation.theacceptanceandsendingofinformation:includingtextinformationandimageinformation.findaddfriendsfeature:theabilitytofindausernamethatcorrespondstotheuserandaddittoyourfriendrequest.chats,viewthefeatures:theabilitytoseethetextchatwiththeuserrecordfromthedatabase.Keywords:DatabaseSoftwareEngineeringLANSocket目录第1章引言 11.1导论 11.2课题现状 21.3开发平台、开发技术的介绍 31.4本章小结 3第2章需求分析及可行性研究 42.1需求分析 42.2可行性研究 52.3本章小结 6第3章系统的需求分析 73.1系统Win32编程 73.2MFC 93.3TCP/IP协议及WINDOWSSOCKETS网络编程接口 113.4多线程技术 143.5本章小结 16第4章概要设计 174.1总体设计 174.2界面的设计 174.3界数据结构设计 194.4章小结 20第5章详细设计及编码实现 215.1服务器端 215.2客户端 245.8本章小结 27第6章测试 286.1测试项目 286.2测试结论 286.3本章小结 28第7章总结与展望 29参考文献 30致谢 32第1章引言1.1导论即时聊天工具是一种可以让使用者在网络上实时通讯的工具,大部分的即时通讯工具提供了状态信息的特性,如显示联络人名单,联络人是否在线及能否与联络人交谈等。目前在互联网上受欢迎的即时通讯软件包括百度QQ、MSNMessenger、Yahoo!Messenger、AOLInstantMessenger、NETMessengerService、Jabber、ICQ等。随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本文提出了一个更加合理的设计,并在WINDOWS平台上加以了实现.在本实现内将客户端和服务端综合在一个程序之内,用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。在本文中将讨论一种基于MFCSocket的局域网通信工具的设计与实现方法。基于MFCSocket的局域网通信软件可以为局域网提供一种良好、安全、快速的通信机制,在局域网内部通信、教学、讨论等应用中都具有一定的实用价值,它同时很好地诠释了MFCSocket通信的原理。基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。我在本文中将讨论一种基于Socket的局域网通信工具的设计与实现方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。1.2课题现状基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟,比如较早的ICQ、MSNMessenger、YAHOO通等国外开发的产品,还有国产的有名的QQ、新浪UC、LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等,而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但由于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要简单,但是可以借此理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。1.3开发平台、开发技术的介绍windowsocket网络编程简介WindowsSockets规范以U.C.Berkeley大学BSDUNIX中流行的Socket接口为范例定义了一套开放的、支持多种协议的、MicrosoftWindows下的网络编程接口,并不是一种网络协议。它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。WindowsSockets规范本意在于提供给应用程序开发者一套简单的API,使应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。现在的WindowsSockets已经基本上实现了与协议无关,你可以使用WindowsSockets来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。微软为VC定义了WindowsSockets类如CAsyncSocket类和派生于CAsyncSocket的CSocket类,它们简单易用。1.3.2C#我们通常所说的VisualC#实际上是一个完善的、非常强大的C#程序开发环境,它的名字是MicrosoftVisualStudio。二者之间的细小差别并不重要,通常这两个术语可以互换。但如果你不围绕VisualStudio来进行学习,就不能有效地使用VisualC#(VisualStudio听起来很像DeveloperStudio,但它们之间没有关系)。它包含:C#编译器、调试器、应用程序框架生成器、项目管理器、设计和实现菜单等资源的编辑器等等。在本项目的开发过程中C#是作为主要的编程语言,在学习C#语言的运用时我主要参考了[23]马晓晖.C#技术揭秘[M].北京:工业出版社,2003.1-400这本书上面的内容。1.4本章小结通过本章编写,我对该项目的大方向有了个比较全面的认识,这为我以后对系统的改造创造了条件。第2章需求分析及可行性研究2.1需求分析功能需求分析1、用户端之间的信息发送,本程序需要实现的最基本的功能。用户在界面上选择需要对话的IP,并将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,预计利用TCP/IP协议中的UDP协议,在本程序中共需要3个端口,此功能预计使用3号端口。2、在线用户主机IP列表的维护。在用户发送信息之前,需要选择相应的目的地端IP,这也就需要客户端拥有在线用户主机的IP地址,这个在线主机列表的维护是需要客户端定时自动向服务器端发送信息,服务器端收集并维护在线用户列表,再发送回客户端。需要在客户端和服务器端都使用定时器来完成此功能。此功能预计使用1、2号端口。3、在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。数据需求分析1、客户端之间聊天信息。在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。2、在线用户列表信息。服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。3、客户端向服务器端发送的确认在线信息。包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。4、其它程序内部可能需要设计的数据结构体。性能需求分析1、可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。2、宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。3、开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。4、模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。运行需求分析1、用户界面程序较小,启动速度快,无启动界面。在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。2、故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。2.2可行性研究成本可行性学习研究性开发,暂不考虑成本。技术可行性已有搭建好的基于Windows的软硬件平台,本人对VC开发环境有一定的了解,需继续深入学习VC和Windowssocket编程。2.3本章小结本章主要是针对该系统在市场需求和系统采用在架构和技术进行了分析,该系统的市场需求还是比较好的,我们充分比较了B/S,C/S的优劣以及该系统本身的特性,最终决定采用B/S的架构,同时我还探讨了该系统实现的可能性,在目前我所掌握的技术条件和设备的前提下是完全能够满足该系统的开发工作。第3章系统的需求分析3.1系统Win32编程所谓的Win32开发,就是在C语言的层面上,直接使用Win32API(ApplicationProgrammingInterface:系统开放出来,给程序员使用的接口。)开发Windows应用程序或者系统程序。虽然现在直接用Win32API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的良好途径。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。下面是进行直接的WIN32SDK方式编程的基本思路或者说是一个框架。一个WINDOWS程序分为程序代码和UI(UserInterface用户接口)资源两大部分,两部分最后以RC编译程序编译为一个完整的EXE文件。所谓UI资源是指功能菜单、对话框外貌、程序图标、光标形状等等。这些UI资源的实际内(二进制代码)系借助各种工具产生,并以各种扩展名存在,如.ico.bmp.cur等等。程序员必须在一个所谓的资源描述档(.rc)中描述它们。RC编译器(RC.EXE)读取RC文件的描述后将所有UI资源文件集中制作出一个.RES文件,再与程序代码结合在一起,这才是一个完整的Windows可执行文件。如下图所示:Windows程序将会调用许多的函数,来实现其一定的功能,这些函数可分为CRuntimes以及WindowsAPI两大部分,而API由操作系统本身来提供,包括GDI32.LIB、USER32.LIB、KERNEL32.LIB、COMDLG32.LIB、TH32.LIB等等,前三个为Windows的三大模块所对应的import函数库。“以消息为基础,以事件为驱动。”Windows程序依靠外部发生的事件来驱动,也就是说:程序不断的等待消息,外部事件以消息的形式进入系统后放入相应的队列,然后程序调用GetmessageAPI取得相应的消息并做出相应的处理。窗口是用来接受并处理消息的,每个窗口都对应一个函数来处理消息,程序员必须设计这个窗口函数(windowsprocedure)。如下图所示,Windows程序与OS之间的关系是:1、WinMain函数main()函数是C程序的进入点,而WinMain函数是Windows程序的进入点,2、MSG结构体定义了一个MSG结构体,是Windows内设的一种数据格式:3、注册窗口RegisterClass()完成注册窗口类的功能,设定窗口的属性:边框、颜色、标题、位置等等。4、创建窗口CreateWindow函数可以用于创建父窗口、弹出窗口以及子窗口,在创建窗口时它可以确定窗口类、窗口标题、窗口风格、大小以及初始化位置。5、显示窗口创建窗口后需要使用ShowWindow用于显示窗口。6、刷新窗口调用UpdateWindow函数来刷新窗口。7、消息循环初始化工作完成后,WinMain进入所谓的消息循环,使用while循环,不断的GetMessage,再使用TranslateMessage将消息转化,用DispatchMessage将消息传递给窗口函数去处理。8、获取消息GetMessage功能函数从消息队列中获取消息,如果消息队列中没有消息,此功能函数则会一直等得消息。9、转换消息将特定的消息转换为不同的消息,例如消息队列中同时有WM_KEYDOWN和WM_KEYUP消息时,意味着用户同时按下了键盘上的某几个键,此时TranslateMessage将其转换为一个WM_CHAR消息。10、将消息发送到回调函数DispatchMessage通过USER模块的协助将消息送到该窗口的窗口函数去了,但是DispatchMessage并没有指定函数名,却可以将消息传送过去,这是因为消息发生的时候,OS已经根据当时状态,为它标明了所属窗口,而窗口所属的窗口类亦是明确的。11、WinMain函数返回值returnmsg.wParam;//返回结构体变量msg中的wParam的值。12、WindowProc窗口函数窗口中的生命枢纽:窗口函数WindowProc。WindowProc是一个callback函数,常利用switch/case方式判断消息的种类,以决定处理方式。3.2MFC简介MFC是在1992年随微软的MicrosoftC/C#7.0编译器发布的,是建立在WindowsAPI之上的C#类库(C#ClassLibrary),意图是使Windows程序设计过程更有效率,更符合面向对象的精神。现在MFC已经成为了Windows环境上标准的C#API。MFC使得开发Windows应用程序变得简单容易,将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同时,在VisualC#内部也内建了很多对MFC的非常实用的东西,例如类向导这样的支持,减少软件开发的时间,使用类向导可以生成从helloworld这样的简单程序到活动文档服务器这样的复杂程序。MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。MFC在整个Windows家族中都是兼容的。在学习使用MFC的过程中我参考了[25]侯俊杰.深入浅出MFC[M]这本资料。MFC与C语言API的关系设置Microsoft基本类库与其它Windows类库所不同的唯一特征就是它与C语言编写的WindowsAPI的紧密的映射关系。而且,可以将直接调用WindowsAPI与调用类库自由地混合起来使用。这种直接访问并不意味着类可以完全取代API。开发者有时必须直接调用一些Windows函数,例如,SetCursor和GetSystemMetrics。只有在有明显优势时,一个Windows函数才被一个类成员函数所替代。MFC类库MFC类库是一个很大的、扩展了的C#类层次结构,与传统上使用C语言直接访问WindowsAPI相反,MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的Windows程序所必需的,因此用MFC编写的程序要比用C语言编写的程序小得多,当然MFC所编写的程序的性能也毫无损失。必要时,也可以MFC可以用面向对象的方法来调用WindowsAPI,因为MFC不修改也不隐藏Windows程序的基本结构。MFC是很庞大的。例如,版本4.0中包含了大约200个不同的类。事实上,你可能只需要使用其中的十多个不同的类,就可以建立一个非常漂亮的程序。MFC层次结构大约可分为几种不同的类型的类:1、根类:Cobject Microsoft基本类库中的大多数类都是由在类层次表中根上的唯一的一个基类派生而来的。2、MFC应用结构类MFC应用构造类有助于一个框架应用的构造。它们对大多数应用提供了通用功能。可以在框架中填写对于应用特定的功能。3、窗口、对话和控件类类CWnd和它的派生类封装了HWND,它是一个Windows窗口。CWnd可被自己使用,也可以作为派生新类的基类。类库提供的派生类表示各种窗口。CWnd是所有窗口的基类。可以使用CWnd派生出来的一个类,也可以从其中派生出自己的类。4、绘画和打印类在Windows中,所有的图形输出都是在一个可视的绘图区上。这叫作一个设备上下文(或DC)。MFC提供了封装不同DC类型的类,也提供了对Windows绘图工具,例如位图、刷子、调色板和笔的封装。5、文件和数据库类这些类允许将信息存储在一个数据库或一个磁盘文件中。有两个数据库类的集合──DAO和ODBC──它们提供了相似的功能。6、Internet和网络类这些类允许和其它使用ISAPI的计算机或一个WindowsSocket交换信息。还有创建ISAPI扩展DLL的类的集合和操作Windows套接字的类的集合。支持连接的类的分类:ISAPI类、Windows套接字类、Win32Internet类。7、其它还有简单的数据类型类、OLE类、调试和异常类、数组列表和映射类。3.3TCP/IP协议及WINDOWSSOCKETS网络编程接口TCP/IP协议简介1、TCP/IP协议通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(UserDatagramProtocol)协议、ICMP(InternetControlMessageProtocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、等。这其中一些协议最早发源于美国国防部的ARPA网项目。2、逻辑结构:(附件—图3)这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。这样的分层结构决定了计算机在internet上互相通信的方式。数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“@”代表网址,理解这样的分层结构是理解INTERNET技术的基础。3、本论文涉及到的协议:IP、UDPIP(InternetProtocol)是TCP/IP的心脏,也是网络层中最重要的协议。IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。UDP(IP协议号17)是一个无连结的数据报协议。它是一个“besteffort”或者“不可靠”协议——不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。UDP的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS查找这样的简单查询/响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例地大。本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择UDP协议。WINDOWSSOCKETS网络编程接口概述1、WINDOWSSOCKETS简介WindowsSockets:用于MicrosoftWindows环境下的网络计算的开放接口。WindowsSockets规范为Microsoft定义了一个二进制兼容网络编程接口,基于BerkeleySoftwareDistribution中的UNIX套接字实现,通过使用WindowsSockets,应用程序能够在任何符合WindowsSocketsAPI的网络上通信。许多网络软件供应商支持网络协议下的WindowsSockets,这些协议包括:传输控制协议/网际协议(TCP/IP)和NovellCorporation的互联网包交换协议/顺序分组报文交换协议(IPX/SPX)等。虽然目前的WindowsSockets规范定义了TCP/IP的套接字抽象化,但任何网络协议都可以通过提供自己版本的、实现WindowsSockets的动态链接库(DLL)来满足WindowsSockets。因为套接字使用网际协议组,所以它们对于支持“信息高速公路”上Internet通信的应用程序是首选方式。套接字是一个通信终结点,它是WindowsSockets应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。目前,套接字一般只与使用网际协议组的同一“通信域”中的其他套接字交换数据。可用的套接字类型有以下两种:流式套接字,提供没有记录边界的数据流,即字节流;数据文报套接字,支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺序或不重复,可靠性在局域网(LAN)上往往很好,但在广域网(WAN)上却不太好。数据文报为“无连接”的,也就是不建立显式连接。可将数据文报消息发送到指定的套接字,然后从指定的套接字接收消息。2、相关MFC类MFC为使用WindowsSockets编写网络通信程序提供了两种模型,内嵌在两个MFC类中。CAsyncSocket该类封装WindowsSocketsAPI。CAsyncSocket是为那些了解网络编程并希望能够灵活地对套接字API直接编程,同时还希望方便地使用回调函数以进行网络事件通知的程序员提供的。除了将套接字打包为面向对象的形式以用于C#外,此类提供的唯一附加抽象化是将某些与套接字相关的Windows消息转换为回调。CSocket从CAsyncSocket派生出的高水平抽象概念,它通过MFCCArchive对象提供与套接字一起使用的更高级的抽象化。使用带存档的套接字与使用MFC的文件序列化协议非常相似。这使它比CAsyncSocket模型更易于使用。它是同步运行的。3、WinSocket编程一般流程(基于UDP)本程序选择使用CSocket类,基于UDP的编程。对于在一个无连接套接字上接收数据的进程来说,步骤并不复杂。先用WSAStartup来加载WinscockDLL相应版本,然后用socket或WSASocket建立套接字。再把这个套接字和准备接收数据的接口绑定在一起。这是通过bind函数来完成的。最后在使用完WinscockDLL需要调用WSACleanup,将资源释放。和面向连接会话不同的是,我们不必调用listen和accept。4、Winsock的初始化每个Winsock应用都必须加载WinsockDLL的相应版本。如果调用Winsock之前,没有加载Winsock库,这个函数就会返回一个SOCKET_ERR,错误信息是WSANOTINITIALISED。加载Winsock库是通过调用WSAStartup函数实现的。这个函数的定义如下:intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);5、创建套接字SOCKETsocket(intaf,inttype,intprotocol);6、把套接字和准备接收数据的地址、接口绑定在一起intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);7、发送数据intsendto(SOCKETS, //一个可用的SOCKETconstcharFAR *buf, //需要传输的数据intlen, //传输数据的长度intflags, //标记conststructsockaddrFAR*to,//指向存有目的ip和端口的结构体inttolen //目的地址的长度);8、接收数据intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);3.4多线程技术进程及线程概述进程和线程都是操作系统的概念。每个进程是由一个或多个线程、私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过 程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。进程是应用程序的执行实例。线程是进程内的执行路径,也是Win32安排的最小执行单元。线程包括堆栈、CPU寄存器的状态和系统计划程序执行列表中的项。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的,此线程终止时,进程也终止。用户可以根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中,所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,但是必须使用信号灯或其他进程间的通信方法协调它们的工作。一般情况下进程中的每个线程都独立运行的,对进程中的其他线程一无所知,除非使这些线程相互可见。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。MFC对多线程编程的支持Win32SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。VisualC#6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。CWinThread对象代表在一个应用程序内运行的线程。运行的主线程通常由CWinApp的派生类提供;CWinApp由CWinThread派生。另外,CWinThread对象允许一给定的应用程序拥有多个线程。CWinThread支持两种线程类型:工作者线程和用户界面线程。工作者线程没有收发消息的功能:例如,在电子表格应用程序中进行后台计算的线程。用户界面线程具有收发消息的功能,并处理从系统收到的消息。CWinApp及其派生类是用户界面线程的例子。其它用户界面线程也可由CWinThread直接派生。CWinThread类的对象存在于线程的生存期。如果你希望改变这个特性,将m_bAutoDelete设为FALSE。要使你的代码和MFC是完全线程安全的,CWinThread类是完全必要的。框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread对象管理。由于依赖CWinThread来处理线程局部数据,任何使用MFC的线程必须由MFC创建。例如,由运行时函数_beginthreadex创建的线程不能使用任何MFCAPI。为了创建一个线程,调用AfxBeginThread函数。根据你需要工作者线程还是用户界面线程,有两种调用AfxBeginThread的格式。如果你需要用户界面线程,则将指向你的CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果你需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。对于工作者线程和用户界面线程,你可以指定可选的参数来修改优先级,堆栈大小,创建标志和安全属性。AfxBeginThread线程将返回指向新的CWinThread对象的指针。与调用AfxBeginThread相反,你可以构造一个CWinThread派生类的对象,然后调用CreateThread。如果你需要在连续创建和终止线程的执行之间重复使用CWinThread对象,这种两步构造方法非常有用。创建线程也可以使用API函数:CreateThread函数完成,本程序使用的就是此函数。其它还有挂起线程、结束线程等函数,在本程序中没有涉及到,将不再一一详解。3.5本章小结本章主要是针对进程和线程都是操作系统的概念。每个进程是由一个或多个线程、私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。进程是应用程序的执行实例。第4章概要设计4.1总体设计客户端与服务器端的信息交流启动客户端后与服务器端的信息交换流程:在客户端启动后,客户端计算得到本地网络的广播地址,进行广播查找服务器端,服务器接收到客户端的广播信息后返回服务器地址,则客户端接收、验证信息并记录服务器端地址,然后客户端启动定时期,定时发送信息到服务器,以告知服务器自己在线,然后服务器返回在线用户列表,服务器依靠客户端发送的信息来更新维护在线用户列表。在客户端与服务器尽心数据交换,拥有了在线用户列表后,就可以选择IP进行客户端之间的点对点信息交流了。如果服务器不在线,则客户端会提示用户退出,在一定的时间后自动退出。服务器端程序流程启动服务后服务器端开始接收客户端发送过来的初始化信息或确认在线信息,进行判断后作出相应的处理,在最后向客户端返回在线用户列表信息;服务器端使用一个定时器对在线用户列表进行维护。客户端程序流程客户端也设置一个定时器,定时向服务器发送确认在线信息,并接收服务器返回的在线用户列表信息。发送用户信息作为单独的模块处理。4.2界面的设计MFC控件简介使用对话框窗口,可以在其上面放置各种各样的标准控件和扩展控件,使用户更容易使用,程序更容易与用户交流。在MFC中,所有的控件都是由CWnd类派生来的,控件可以出现在视窗窗口、工具栏和状态条中,在对话框与用户的交互过程中,担任着重要角色。基本的控件如下图所示: 图4-1MFC控件图界面设计图4-2聊天窗口图程序与界面的信息交流程序处理完数据后,要发送到控件显示出来,在用户对控件操作后,要有对应的程序函数进行处理。上图已标明各控件的功能,与程序函数的交流将在功能函数设计和相应代码的地方进行说明。4.3界数据结构设计1、在线用户信息结构体:structUSERINFO{ CString ip; //存储IP BOOL on_line; //用于判断次IP是否更新过,未更新则从单向链表中删除 USERINFO *next; //下一个存储单元的地址,最后一个为NULL};注:用于构建服务器端的在线用户单向链表。2、从服务器端发送到客户端的在线用户列表信息结构:3、传输到线程的信息结构体:客户端:structRECVPARAM{ SOCKET sock; //存储接口套接字 HWND hwnd; //存储窗口句柄};服务器端:structRECVPARAM{ SOCKET sock; //存储接口套接字 HWND hwnd; //存储窗口句柄 BOOL endtread; //存储用于判断是否退出线程循环 USERINFO *userhead; //存储在线用户单向链表的头指针};注:线程函数为静态函数,无法调用成员变量和成员函数,所以需要将需要的数据传送进去。4.4章小结本章对客户端后与服务器端的信息交换流程进行了系统的概要设计,对客户端和服务器的通讯方式和通讯流程做了详细的解释,为下一步的详细设计打下基础。第5章详细设计及编码实现5.1服务器端初始化对话框在功能函数BOOLCServerDlg::OnInitDialog()下设置对话框显示“未启动服务”。SetDlgItemText(IDC_showip,"未启动服务!");启动服务调用Winsock之前加载WinsockDLL的相应版本,上面已作详细说明;创建套接字socketsev,并绑定到本地IP、6700端口。定义并初始化在线用户链表的头userhead。 userhead=newUSERINFO; userhead->ip=""; userhead->on_line=TRUE; userhead->next=NULL;创建RECVPARAM结构体,用于存放socktsev和本窗口句柄m_hWnd pRecvParam=newRECVPARAM; pRecvParam->sock=socktsev; pRecvParam->hwnd=m_hWnd; pRecvParam->userhead=userhead; pRecvParam->endtread=TRUE;创建线程,并关闭返回的线程句柄 HANDLEhThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL); CloseHandle(hThread);设计定时器 SetTimer(1,2000,NULL);将显示在线IP区域清空 SetDlgItemText(IDC_showip,"");将开始服务控件设为不可用,停止服务控件设为可用 GetDlgItem(IDC_stop)->EnableWindow(TRUE); GetDlgItem(IDC_start)->EnableWindow(FALSE);停止服务将pRecvParam变量中的endtread设为FALSE,以便关闭线程 pRecvParam->endtread=FALSE;关闭套接字,并释放资源 closesocket(socktsev); WSACleanup();关闭定时器 KillTimer(1);设置显示IP区域文字为“服务停止”,将开始服务控件设为可用,停止服务控件设为不可用 SetDlgItemText(IDC_showip,"服务停止!"); GetDlgItem(IDC_stop)->EnableWindow(FALSE); GetDlgItem(IDC_start)->EnableWindow(TRUE);定时器的功能函数定时器定时调用的功能函数,用于刷新在线用户链表。循环判断在线用户IP链表中的IP是否为有效信息,无效则删除,并释放空间,然后将在线用户链表中的信息放到itemtext中。创建线程时调用的功能函数循环接收客户端发来的确认在线消息,并判断是什么样的信息,做出相应的处理。 if(test=="initialize"){ CStringsendmsgip=""; addrTo.sin_addr.S_un.S_addr=inet_addr(tempipaddr); sendmsgip+="sevip"; sendto(sock,sendmsgip,sendmsgip.GetLength()+1,0, (SOCKADDR*)&addrTo,sizeof(SOCKADDR)); } 用于判断是否存在了现在对话的IP,FALSE为不存在,TRUE为存在。 judge=FALSE; 循环检查刚刚发送过来确认信息的IP地址是否存在于在线用户链表中 while(q!=NULL);刚刚发送过来确认信息的IP地址未存在于在线用户链表中,则加入到在线用户链表中 if(judge==FALSE){ USERINFO*tempuser=newUSERINFO; p->next=tempuser; tempuser->ip=tempipaddr; tempuser->on_line=TRUE; tempuser->next=NULL; }将在线用户链表格式化存储在user_online中 p=((RECVPARAM*)lpParameter)->userhead; q=p->next; addrTo.sin_addr.S_un.S_addr=inet_addr(tempipaddr); CStringuser_online=""; while(p!=NULL) {……}在控件上显示参数CStringstr=(char*)lParam; SetDlgItemText(IDC_showip,str);服务器端信息映射机制控件IDC_start、IDC_stop与函数Onstart、Onstop的映射 ON_BN_CLICKED(IDC_start,Onstart) ON_BN_CLICKED(IDC_stop,Onstop)定时器 ON_WM_TIMER()WM_RECVDATA消息对应的功能函数为OnRecvData ON_MESSAGE(WM_RECVDATA,OnRecvData)5.2客户端 初始化对话框初始化SOCKETInitSocket();初始化需要传入线程1中的参数,并创建线程1,线程1用于接收服务器信息pRecvParamSev=newRECVPARAM;pRecvParamSev->sock=socketSev;pRecvParamSev->hwnd=m_hWnd;HANDLEhThread=CreateThread(NULL,0,RecvProcSev,(LPVOID)pRecvParamSev,0,NULL);初始化需要传入线程2中的参数,并创建线程2,线程2用于接收客户端信息,代码略。关闭线程句柄,释放资源,设置定时器CloseHandle(hThread); SetTimer(1,2000,NULL);获得本地广播地址的功能根据主机名获取主机IP,并将点分十进制分别存放到a,b,c,d hostEntry=gethostbyname(hostName);a=(hostEntry->h_addr_list[0][0]&0x00ff)判断主机地址是A、B、C类中那类的地址,并计算其广播地址 if(a>0&&a<=127) wsprintf(tempAddress,"%d.%d.%d.%d",a,e,e,e); elseif(a>127&&a<=190) wsprintf(tempAddress,"%d.%d.%d.%d",a,b,e,e); elseif(a>190&&a<=223) wsprintf(tempAddress,"%d.%d.%d.%d",a,b,c,e); broadcastip=tempAddress;初始化两个SOCKET的功能函数详例查看附录。接受服务器信息线程的功能函数循环等待接收服务器信息,直至程序关闭 while(TRUE) {……代码在上面已有说明} 向系统发送句柄为hwnd窗口的WM_RECVIP消息,WPARAM参数为retval,LPARAM参数为recvBuf。通过消息映射机制,WM_RECVIP消息对应的功能函数是OnRecvIP::PostMessage(hwnd,WM_RECVIP,(WPARAM)retval,(LPARAM)recvBuf);在控件上显示在线用户列表接收通过wParam参数传送过来在线用户链表信息,更新自身维护的在线用户信息链表,并在控件上显示出来。判断在更新在线用户列表前,用户选择的IP是否还存在在本地列表中,如果存在,则将选择项设为这个IP,如果没有了,则将选择项设为控件上第一个IP。接受客户端信息将发送过来的信息格式化为“IP说***”sprintf(tempBuf,"%s说:%s",inet_ntoa(addrFrom.sin_addr),recvBuf);发送消息WM_RECVDATA,调用OnRecvData函数来显示对话信息::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);点击IDC控件后调用的函数提取控件上的信息后,利用socketSev发送出去:sendto(socketSev,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));提取自己需要发送的信息(在控件IDC_sendmsg上),并格式化为“我说:***”并发送WM_RECVDATA消息,使用OnRecvData函数,将自己发送的信息显示在IDC_showmsg控件上。GetDlgItemText(IDC_sendmsg,strSend);SetDlgItemText(IDC_sendmsg,"");sprintf(tempBuf,"你说:%s",strSend);PostMessage(m_hWnd,WM_RECVDATA,0,(LPARAM)tempBuf);定时器功能函数在控件上显示服务器在线状况,如果发送一定数量的initialize信息,服务器都不回复信息,则提示用户退出,如果用户不退出,则在向服务器发送第18次initialize信息后自动退出程序。5.8本章小结本章对于局域网通讯工具系统的具体实现包括服务器端、客户端的初始化及工作原理做了详细的介绍,阐述了该软件的具体实现过程。第6章测试6.1测试项目黑盒测试拷贝客户端与服务器端到两台装有WindowsOS计算机上,分别运行两个客户端和一个服务器端,使用软件的一个客户端向另一个客户端发送消息,第一个客户端可以正常发送消息并可以正常的在本地软件相应位置显示,对应的接收端可以接收到正常的信息并显示;查看服务器端维护的在线用户信息正常,客户端接收到的在线用户列表信息与服务器端相同,在有一个客户端下线或上线时,可以在一定的时间内得到更新,说明服务器端可以正常维护在线用户列表,并将在线用户列表正常的发送到客户端。总体来说聊天信息发送功能与在线用户列表维护功能正常,能实现前期需求分析时需求的功能。在使用后可以得出的结论为:客户端与服务器端的信息交流、客户端之间信息发送与接收、在线用户列表的维护三项基本功能运行正常。白盒测试利用C#的调试功能,在代码中插入断点进行单步跟踪。启动一个客户端,在服务器端的程序中,选择关键位置插入断点,在程序运行到此处时停止检查相应数据的完整性与正确性,此过程中需要检测的为服务器维护在线用户列表的检测与发送数据的正确性,检测中可以发现,服务器端可以正常运行,且程序没有出现异常。启动服务器端,然后在客户端的程序中插入断点,检测客户端发送消息功能与接收显示维护在线用户列表的功能,在相应的断点处的数据与程序运行都正常,没有异常现象发生。在测试过程中,各个模块的功能皆可进行正常运行,数据也未发生异常现象。6.2测试结论本章对该通讯工具的功能、性能等各个方面试用了最常用的测试方法白盒测试与黑盒测试两种测试方法,按照软件的需求来对比测试结果。6.3本章小结 通过本章的学习,我对黑盒测试有了比较深刻的认识,我也学会了如何测试,也加深了对测试的理解。第7章总结与展望我在本次毕业设计中将讨论一种基于Socket的局域网通讯工具的分析与设计方法。基于Socket的局域网通讯软件可以为企业原有的局域网提供一种良好,平安,快速的通讯机制。它的完成无需对企业原有的局域网硬件停止任何改动,具有完成本钱昂贵的优点,它的运用能有效地降低局域网通讯负荷,提高局域网的运用效率,可以很好地处置企业内部局域网的各种通讯需求近年来,随着全球信息化进程的不时开展,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论