UDP局域网QQ聊天程序设计说明书_第1页
UDP局域网QQ聊天程序设计说明书_第2页
UDP局域网QQ聊天程序设计说明书_第3页
UDP局域网QQ聊天程序设计说明书_第4页
UDP局域网QQ聊天程序设计说明书_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。摘要随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。本设计开发的是一个局域网QQ聊天软件,运用软件工程的设计流程,使用现在比较普遍和流行的C#语言,采用面向对象的方法,综合运用数据库编程技术、多线程开发技术、网络通讯技术,以MicrosoftVisualStudio2005作为系统前台应用程序开发工具,MicrosoftSQLServer2000作为后台数据库管理系统,在WindowsXP平台下进行开发。本局域网QQ聊天软件采用服务器端/客户端(C/S)模式。客户端采用UDP与服务器连接,客户端之间也是通过UDP互相通讯。服务器端主要用于开启和关闭UDP协议的监听服务,还可以查看局域网内已注册的所有的用户以及他们的在线状态。客户端分为注册窗口、登录窗口、QQ窗体主界面以及聊天界面。服务器端要先开启监听服务,客户端才可以进行登录,然后才可以与其他登录的在线用户进行文本信息的聊天,还可以进行点对点的语音聊天,视频聊天和文件传输,还可以进行拍照和录像等。此外,还对该软件进行了皮肤的加载以及打包成安装源。该软件运行稳定,界面美观、操作简便。在局域网内部使用该局域网QQ聊天软件,可以方便人与人之间的沟通、交流;可以大大提高企业的工作效率;拉近人与人之间的关系。关键词:局域网;聊天软件;客户端;服务器端;UDP协议AbstractWiththedevelopmentofnetworkingtechnologyandthelivingdemandofpeople,chattingonnetworkismoreandmoreacceptablebypeople.Internetchathasbecomeanimportanttooltotransmissionofinformationandexchangeoffeelingsinourlife,itbringsagreatconvenience.ThetopicofthispaperisgoingtotalkaboutthattodevelopthelocalareanetworkQQchatsoftware.Thislocalareanetworkchatsoftwareusingthedesignstreamofthesoftwareproject,usingtheC#languagewhichisverycommonandpopular,usingtheobject-orientedapproach,thetechnologyofthedatabaseprogramming,multi-threadingdevelopmenttechnologyandthenetworkcommunicationtechnology,makesMicrosoftVisualStudio2005asthefrontapplicationdesigntool,MicrosoftSQLServer2000areusedasthebackgroundDBMS(thedatabasemanagementsystem),anditwasprogrammedintheWindowsXPSystem.ThelocalareanetworkQQchatsoftwareusestheserverandclient(C/S)mechanism.AndtheclientconnectstheserverusingUDP,andtheycommunicateeachotherbyUDP.Server-sideismainlyusedtoopenandclosetheUDPprotocolmonitoringservice,andyoucanalsolookoveralltheregisteredusersandtheironlinestatuswhominthelocalareanetwork.Clientisdividedintoregistrationwindow,theloginwindow,themainQQformandthechatform.Iftheclientwantstologin,theservermonitoringservicemustfirstopenthelisteningservice,thentheclientcanchatwiththeotherswhichhavealreadylogged,andalsocanvoicechat,videochatandfilestransfers,andalsocantakepicturesandvideos.Inaddition,thesoftwarehasbeenloadthebeautifulskinandpackageintotheinstallationsource.Thissoftwarehasaninterfaceaesthetics,stableoperation,simpleoperation.UsingQQsoftwareintheLANinternalcanhelppeopletocommunicatewithotherseasily,cangreatlyimprovetheefficiencyoftheenterprises,closerelationshipsbetweenpeople.KeyWords:LocalAreaNetwork;ChatSoftware;Client;Server-side;UDPprotocol目录引言 错误!未定义书签。系统概述与需求分析 错误!未定义书签。系统概述 错误!未定义书签。需求分析 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。可行性分析 错误!未定.义书签。2系统总体设计 错误!未定义书签。相关开发技术的原理性说明 错误!未定义书签。FrameWork和C# 错误!未定义书签。Server2005 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。2.2系统功能结构 错误!未定义书签。业务流程图 错误!未定义书签。程序运行环境 错误!未定义书签。3数据库以及类库的详细设计与实现 错误!未定义书签。数据库的创建 错误!未定义书签。 错误!未定义书签。 错误!未定义书签。……………………… 错误!未定义书签。..…………………..错误!未定义书签。………………………..错误!未定义书签。类库的设计 错误!未定义书签。4客户端模块的详细设计及实现 错误!未定义书签。客户端注册模块的设计 错误!未定义书签。 错误!未定义书签。 ……………..错误!未定义书签。 ……………..错误!未定义书签。客户端登陆模块设计 错误!未定义书签。 错误!未定义书签。 ……………..错误!未定义书签。 ……………..错误!未定义书签。客户端QQ模块设计 错误!未定义书签。..…………………..错误!未定义书签。 ……………..错误!未定义书签。 ……………..错误!未定义书签。客户端消息发送模块设计 错误!未定义书签。 错误!未定义书签。 ………..错误!未定义书签。 ………..错误!未定义书签。5服务器端模块的详细设计与实现 错误!未定义书签。服务器端控制台窗体概述 错误!未定义书签。服务器端控制台窗体技术分析 错误!未定义书签。服务器端控制台窗体实现过程 错误!未定义书签。6系统特色及关键技术 错误!未定义书签。7结论 错误!未定义书签。谢辞 错误!未定义书签。参考文献 错误!未定义书签。附录 错误!未定义书签。引言在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具。网络版的聊天软件种类繁多,如QQ、OICQ、MSN等,给人们带来了很大的方便,也使世界好象一下子缩小了,不管在哪里,只要能上网,打开这些软件,就可以给朋友发信息,不管对方是否也同时在线,只要知道对方的号码。但是这些聊天软件也存在以下不足:用户必须连接Internet;用户在工作时容易沉迷于网络聊天。为了方便单位企业内部的信息交流,减少不必要的财力和人力资源浪费,开发一个局域网聊天软件是非常必要的。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。计算机应用技术在日益的普及,网络也遍及到生活的每个角落,很好的利用这些资源,将为人们的工作和学习,带来极大的方便和提高工作效率。现在,企业、机关、学校都建立起了自己的局域网,在局域网,虽然可以通过文件共享的方式进行通讯,但单单使用这种方式,是非常不方便的,首先,在局域网里的网上邻居里,只能看到机器名,不清楚对方是谁,也不知道对方机器里有什么资源可以共享,而且,当局域网的机器很多时,这种方式更加麻烦。于是,就想到做一个在局域网里的聊天软件,在局域网里,可以通过它,实现在局域网里方便的联络,进行文件传输,消息的发布,还可以语音、视频等。所以,开发一个局域网里的基于C/S模式的QQ聊天软件,是十分必要。在学校建立起校园网里,局域网聊天系统可以起到方便同学之间,教师之间,师生之间的相互联络,这样,不用上Intemet,可以节省资源,在学校这个大环境里,就可以同学之间联系,联络感情,促进同学之间的友谊,学生可以通过它来与不同寝室的同学,教师讨论问题。并能最大限度地利用现有的网络资源,极大地提高工作效率。为了适应校园网的建设,实现校园网内进行消息发布,学生交流,师生交流,网上作业等功能。在公司企业建立起的局域网里,应用于局域网内企业(组织)内部成员之间的交流领域,在没有因特网的支持下也可以进行即时通讯,亦因此使之更安全、更高效;同时因为它界面简洁实用,没有娱乐功能,所以简单易用,是企业(组织)成员更加专注于工作,减少不必要的财力和人力资源浪费。因此,本毕业设计开发了一个局域网的QQ聊天软件。该聊天软件分为服务器端和客户端,采用的是C#语言,在WindowsXP系统下,使用的开发工具是MicrosoftVisualStudio2005,运行于.NET平台上,使用SQLServer2000作为后台的数据库管理。为实现和方便客户端之间的通信,在客户端进行了人性化的界面设计,用户可以进行注册,注册后,凭借用户名和密码就可以登陆到QQ聊天界面,然后就可以与其他的在线用户进行局域网内部的文本聊天、语音聊天、视频聊天和文件的传输。系统概述与需求分析系统概述该局域网QQ聊天软件操作简单方便、界面简洁。该系统分为客户端和服务器端。前台为客户端,包括的主要功能有用户注册、用户登陆、文字聊天、文件传输、语音聊天和视频聊天等功能。后台为服务器端,主要功能包括:数据库的建立、查看用户的状态、管理用户的资料、开启和关闭服务器的监听等功能。服务器端直接与数据库相连,服务器端要先开启监听,然后客户端登陆的时候要与服务器端进行通信,服务器端进行验证客户端的用户名和密码。客户端经过服务器端的验证后,才可以登陆成功。本软件还对客户端的各个窗口进行了皮肤加载,使界面看起来更加的美观、大方。本局域网QQ聊天软件还具有系统托盘和右键菜单的功能。每个客户端只能进行一次并且只需注册一次。用户登录成功之后,可以看到局域网内所有的在线和不在线的的注册用户。用鼠标双击打开某一个在线的用户的聊天窗口,就可以与该用户进行文字信息的互发与接收,可以利用本地的摄像头进行录像和拍照,还可以与对方进行点对点的视频、语音和传输文件等操作。本系统运行比较的稳定、安全可靠。此外,本软件还对源程序进行了打包成安装源,便于用户使用的时候进行安装。安装源也分为客户端和服务器的安装源。一般的局域网用户只需要安装客户端即可。需求分析近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的不断扩大,业务量的不断增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部。为了解决上述矛盾,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以随时的与局域网内部的用户进行即时消息的传递,召开网络会议,进行语音视频和文件的传输等,有利于提高工作消息效率,同时又保护了企业内部信息的安全性。本局域网QQ聊天软件主要是采用MicrosoftVisualStudio2005结合SQLSever2000数据库技术,采用C#语言来实现各功能模块的开发。开发出来的软件必须结构比较的合理、功能比较的齐全、使用起来比较的方便。该局域网QQ聊天软件开发的重点和难点是客户端和服务器端与数据库的连接,建立连接后还要保证通信的畅通性和正确性。此外要实现在两个客户端之间实现点对点的文件传输,语音聊天以及视频等功能,也是本局域网QQ聊天软件开发的难点。止匕外,还要着重处理好各模块间的划分以及模块间的连接。在开发中应注意系统性能的优化,数据库的安全和优化,尽可能的提高系统的安全性和整个系统的运行的稳定性。同时,开发出来的软件系统还必需功能完备、安全性高、易于维护和使用,操作也要简单、方便,界面也要简洁、美观、大方。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具。网络版的聊天软件种类繁多,如QQ、OICQ、MSN等,实现了随时随地上网聊天,给人们带来了很大的方便。但是这些聊天软件也存在以下不足:用户必须连接Internet;用户在工作时容易沉迷于网络聊天。为了方便单位企业内部的信息交流,减少不必要的财力和人力资源浪费,开发一个局域网聊天软件是非常必要的。开发该局域网聊天软件需要完成以下的几个要求,以便于用户进行操作。这样才能使该软件易学易用、更加的人性化。合理的设计数据库尽量合理地减少数据库数据的冗余,使重复的数据保持在最小限度,这样将不必要的多占用存储空间,减少产生混乱影响的危险,还能提高计算机的运行速度。设计出友好的界面界面的友好与否是用户评价一个软件优劣的重要方面之一,使用户有一个良好的心情。另外窗口界面的各个控件布局要合理,美观。要充分的利用MicrosoftVisualStudio.Net2005提供的强大的功能。(3)根据局域网对QQ聊天软件的要求,本QQ聊天软件需要实现以下的目标:操作简单方便、界面简洁美观每个客户端只能注册一次可以在局域网中实现文字的传输可以实现多用户的信息通信可以实现两个用户之间的点对点的语音聊天可以实现两个用户之间的点对点的视频聊天可以使用本地的摄像头的进行录像和拍照可以实现两个用户之间点对点的文件的传输和接收系统运行要比较的稳定、安全可靠(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器未启动等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。(2)易操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。(3)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。1.3可行性分析可行性研究的目的就是要用最小的代价在尽可能短的时间内确定问题是否能够解决。可行性研究可以在较高的层次以比较抽象的方式讨论系统的分析和设计。本局域网QQ聊天软件的可行性研究主要从技术可行性、经济可行性、开发可行性和现有的条件四个方面来进行讨论。1)技术可行性随着国内软件开发的日益发展壮大,各种中小企事业单位和学校等部门已具备独立开发各种类型的应用软件的能力,能够满足不同行业的特别的需求。而本局域网QQ聊天软件其在组织关系上并不存在着很大的复杂性,繁琐性,从整个系统的技术构成上来看,它是属于一个与数据库应用有关的软件,使用的是UDP协议。只要对C#语言比较的熟悉,对UDP协议以及Microsoft的API函数相对比较了解的话,开发出这样的一个系统,并不存在很大的困难。2)经济可行性对于整个系统而言,并不需要花费太多的经费。只要一两个人或者一个小团队,即可以完成系统的开发。3)开发可行性本局域网QQ聊天软件采用的是MicrosoftVisualStudio.Net2005作为开发工具,利用SQLServer2000对数据库表进行存储,提供数据之间的操作。首先MicrosoftVisualStudio.Net2005是一个开放的协作式系统,可以连接许多比较常用的数据库。其次它具有可视化的开发环境,使代码的编写比较的直观,并且在可视化环境下的调试和维护也相对比较容易。再次MicrosoftVisualStudio.Net2005提供了大量的控件,这既丰富了应用程序的表达能力,也加快了项目的开发速度。4)现有设备及实验条件:计算机:GenuineIntel(R)CPU2140@1.60GHz1G内存,160G硬盘系统:MicrosoftWindowsXPProfessional版本2002ServicePack3软件:MicrosoftVisualStudio2005MicrosoftSQLServer2000以上的设备,对于开发出一个功能比较完备,性能比较完善的局域网QQ聊天软件,已经足够了。系统总体设计相关开发技术的原理性说明Framework和C#本局域网QQ聊天软件的开发采用的是CIS结构,基于.NET开发环境下,使用C#语言进行开发。C#是一种精确、简单、类型安全、面向对象的语言,是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员AnderSHejlSberg的最新成果.C#看起来与java有着惊人的相似;它包括了诸如单一继承,接口,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。C#的特点:(1)完全面向对象。(2)支持分布式,处理过程可以分布在客户机和服务器上。C#能很好的解决分布式问题。(3)跟Java类似,C#代码经过编译后,成为了一种IL(中间语言)。在运行时,再把IL编译为平台专用的代码。(4)健壮,C#在检查程序错误和编译与运行时错误一点也不逊于Java,C#也用了自动管理内存机制。(5)C#不像Java那样完全摒弃了指针和手动内存管理。C#默认情况下是不能使用指针的,程序员在有必要时可以打开指针来使用。这样可以保证编程的灵活性。(6)安全性:C#的安全性是有.net平台来提供的。C#代码编译后成为IL语言。是一种受控代码,.net提供类型安全检查等机制保证代码是安全的。(7)可移植性:由于C#使用类似Java的中间语言机制。使得C#也跟Java类似,可以很方便的移植到其他系统。在运行时,再把中间代码编译为适合特定机器的代码。(8)解释性:C#也是一种特殊的解释性语言。(9)高性能:C#把代码编译成中间语言后,可以高效的执行程序。(10)多线程:与Java类似,可以由一个主进程分出多个执行小任务的多线程。(11)组件模式:C#很适合组件开发。各个组件可以由其他语言实现的,然后集成⅛.net中。.NETFramework类似于Java虚拟机,它不但使Internet上运行的应用程序更容易被开发,而且也可用于开发运行于Windows桌面上的传统业务应用程序。它为创建、部署以及管理安全、强大、高效的应用程序提供了前所未有的最大支持。.NETFramework是一个创建、部署和运行应用程序的多语言平台环境,.NET支持的语言使用的基类库由.NETFramework类库(FCL)提供。C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。Microsoft是这样描述C#的:C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。Server2005SQLServer数据平台SQLServer是一个全面的、集成的、端到端的数据解决方案,它为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。SQLServer2005为IT专家和信息共作者带来了强大的、熟悉的工具,同时减少了在从移动设备到企业数据系统的多平台上创建、部署、管理及使用企业数据和分析应用程序的复杂度。通过全面的功能集、和现有系统的集成性、以及对日常任务的自动化管理能力,SQLServer2005为不同规模的企业提供了一个完整的数据解决方案。本局域网QQ聊天软件使用的是UDP协议。用户数据报协议(USerDatagramProtocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。是一个简单的面向数据报的传输层协议,IETFRFC768是UDP的正式规范。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、路由信息协议(RIP)和某些影音串流服务等等。选定WindowsXP平台开发网络通信程序,可以选择Windows的Sockets编程接口,WindowsSockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Windowssockets无疑是进行网络编程的利器。所有的WindowsSockets实现都支持流套接口和数据报套接口。应用程序调用WindowsSockets的API实现相互之间的通讯。WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。SOCket,简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读取Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信。一般的Socket网络编程的函数调用步骤如下:(1)创建套接字应用程序在使用套接字前,首先必须创建一个套接字,以便系统分配相应的资源给它。(2)指定本地地址当一个套接字被创建后,存在一个名字空间(地址族),但它没有被命名。需要将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地相关。(3)建立套接字连接即开启监听功能。监听远程客户端的请求。(4)数据传输当一个连接建立以后,就可以进行数据传输了。分为数据的发送和接收。(5)关闭套接字连接也就是关闭监听,并释放分配给该套接字的资源。系统功能结构根据局域网QQ聊天软件的特点,可以将其分为客户端和服务器端两个部分进行设计。客户端主要用于用户的注册、登陆和信息的发送、语音、视频和文件的传输等;服务器端主要用于记录用户注册的用户名、密码、IP地址、端口号以及用户在线的状态等信息,并作为客户端向远程客户端发送信息的一个中转站。UDP局域网聊天程序客户端与服务器端的功能结构图如图2-1所示:UTlP局域随F天程序Q客户端÷l服务器端服务器衔体图2-1局域网QQ聊天程序功能结构图业务流程图UDP局域网聊天程序是由客户端和服务器端组合而成的,业务流程图如图2-2所示。客户端登陆的时候,先判断用户是否已经进行过了注册。如果用户已经注册后,则直接进入到登陆窗口。如果用户没有注册过,则跳转到注册窗口,让用户先进行注册。用户注册需要填写服务器IP地址、端口号、用户名和密码等信息。注册完成后,客户端与远程服务器取得通信,将注册的信息发送到远程的服务器端进行注册保存。客户端在本地将生成一个Server.ini文件,该文件主要是记录服务器的IP地址和端口号以及注册用户的用户名。当用户下一次登陆的时候就是通过读取Server.ini文件,来取得服务器的IP地址和端口号,然后再根据该IP地址和端口号与服务器建立通信。注册完成后,然后就会跳转到登陆窗口。用户只要输入正确的用户名和密码,就可以登陆成功。就可以与服务器端建立通信。登陆之后,就进入到了QQ界面。双击某一个在线的用户,就可以与该用户进行聊天、语音、视频和文本的传输。图2-2局域网QQ聊天软件业务流程图程序运行环境本局域网QQ聊天软件运行的环境具体如下:(1)系统开发平台:MicrosoftVisualStudio2005(2)系统开发语言:C#(3)数据库管理系统软件:MicrosoftSQLServer2000(4)运行平台:WindowsXP(5)运行环境:MiCroSoft.NETFrameworkSDKv2.0数据库以及类库的详细设计与实现数据库的创建在开发应用程序时,对数据库的操作是必不可少的,数据库设计是根据程序的需求及其实现功能所制定的。本局域网QQ聊天软件后台数据库主要是用于记录注册人员的编号、用户名、密码、IP地址、端口号和在线和离线的状态等信息。使用MicrosoftSQLServer2000作为后台数据库。数据库命名为db_MyQQData,其中包含了一张数据表db_CurrencyUser,用于存储当前已注册的用户的基本信息。数据库db_MyQQData的具体创建步骤如下:(1)选择“开始/所有程序/MicrosoftSQLServer/企业管理器”命令,打开SQLServerEnterpriseManager数据库窗体。(2)在SQLServerEnterpriseManager数据库窗体的(local)(WindowsNT)中,用鼠标右键单击“数据库”文件,在弹出的快捷菜单中选择“新建数据库”命令,打开“数据库属性”对话框,在该对话框的“名称”文本框中输入要创建的数据库名称“db_MyQQData”,单击“确定”按钮创建数据库。在QQ用户登陆时,为了可以在服务器端返回所有注册用户的信息,可以在服务器端的数据库中创建一个用户注册表,用于记录注册用户的IP地址、端口号、在线状态、用户名和密码等基本信息。用户注册表的实体E-R图如图3-1所示。图3-1用户注册表的实体E-R图根据上面设计好的E-R图,可以在数据库中创建相应的数据表,此外根据注册用户的实体E-R图来创建数据表。数据库创建完成后,在db_MyQQData数据库的下拉节点的“表”节点上单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,将在SQLServerEnterpriseManager数据库窗体中弹出“新表”对话框。在“新表”对话框的“列名”中输入ID、IP、Port、Name、PaSSWord和Sign字段,将其数据类型分别设置为int、VarChar(20)、int、VarChar(20)、VarChar(20)和int,并将ID字段设为主键和自动编号,然后在各“列”的“描述”文本框中对应字段进行中文解释。字段名称和数据类型设置完成后,单击保存按钮,弹出“选择名称”窗口,在该窗口中输入创建数据表的名称db_CurrencyUser,单击“确定”按钮,就完成了对本局域网QQ聊天软件后台数据库的创建。在本系统中创建了五个解决方案和一个类库,分别是客户端解决方案、表情方案、语音和文件传输方案以及服务器端解决方案,还有一个名为QQClass的类库。为了便于对它们进行操作,将客户端解决方案和类库添加到了服务器端解的决方案中。文件夹组织结构图如图3-2所示。MyQQClient解决方案主要是用于客户端各个窗口的开发,MyQQServer解决方案主要是用于服务器端后台的用户信息管理平台界面的开发,QQClaSS类库主要是对UDP协议进行封装,还有定义其他一些类。ImageListPopupDemo解决方案主要是用于实现QQ表情的发送的,MatureVoice解决方案主要是用于实现语音的,UdpSendFile解决方案主要是用于实现文件的传输功能的。图3-2文件夹组织结构图类库的设计在本局域网QQ聊天软件中,因为在后台服务器端的用户信息管理平台以及前台的客户端的注册窗口、登录窗口、QQ界面窗口以及聊天窗口都需要用到UDP协议。所以本程序中,将UDP协议封装成了一个控件,主要是为了便于客户端和服务器端的调用,并且将UDP控件和自定义类存储在了QQClass类库中。当需要使用到UDP协议的时候,只需要在相应的窗口中加入UDPSocket控件,然后设置UDPSocket控件的相关的属性即可。下面对QQClass类库中的UDPSocket控件和其他的类分别进行说明。(1)UDPSocket控件该控件主要是将UDP协议中的IP地址和端口号以及开启或者关闭的状态以控件的形式进行设置,并自定义一个了DataArrival事件,用于对主机的端口号进行监听,以获取远程计算机发送过来的消息。在自定义控件上制作了localHost、localPort、active属性,以及DataArrival事件。IocalHost用于设置服务器端的IP地址;IocalPort属性用于设置端口号;active属性是一个Bool型,可以控制端口号是否处于监听状态。UDPSOCket控件中包含了方法OPenSOCket和ClOSeSOCketO方法分别用于打开和关闭UDP协议端口的监听功能,并在监听关闭的同时关闭用于接收信息的子线程。Listener()方法用于实现主机端口号的监听功能,主要是将IP地址和端口号以网络端点进行存储,然后创建一个新的端口号,再设置接收缓冲区和发送缓冲区的大小。此外,还创建了一个线程,主要是用于获取当前接收到的信息,就是将获取的远程信息转换成二进制流。在线程打开时,将GetUDPData()方法所接收的信息传递给线程的委托。GetUDPData()方法是在获取远程消息时,将消息转发给UDPSOCket控件的DataArrival事件,可以通过该事件将消息发送给远程客户端。Send()方法用于将主机获取的消息,通过IP地址和端口号发送给远程客户端。通过以上的方法,便制作完成了一个UDPSocket控件。如图3-3所示:图3-3UDP控件属性图(2)PubleC_Class类该类用于记录服务器端和客户端的基本信息,并通过自定义的方法MyHostIP()获取服务器端的所有IP地址,通过自定义方法Get_Windows()获取Windows目录。(3)ClassForms类该类将获取的的窗体在InnerList列表中进行添加和移除操作,在列表中查找相应的窗体。(4)ClassMsg类该类主要是用枚举型的元素指定消息发送的命令、消息类型、消息发送的状态等。其中,发送的消息命令包括了用户的注册、用户注册结束、用户登录、用户登录结束上线、用户列表、打开视频、关闭视频、下线等命令;发送的消息类型包括了无类型、发送命令、发送消息、发送文件等。此外,该类还用来记录发送方和接收方的发送编号、IP地址以及端口号等信息,还记录了用户注册的用户名和密码等信息。(5)ClassOPtionData类该类将服务器端对数据库的操作进行了封装,通过对该类中各方法的调用,可以对数据表进行添加、修改及读取的操作。下面对各方法进行一下简要的说明。①EXSQL()方法该方法通过ConStr参数所传递的SQL语句,对指定的数据表进行查询,并将记录的个数进行返回。②ExSQLReDr()方法该方法通过ConStr参数所传递的SQL语句,对指定数据进行查询,并将查找到的数据信息以SqlDataReader对象进行返回。(6)ClassSerializers类SerializeBinary()方法该方法是在客户端发送信息时,将发送的对象序列化为二进制流,并返回序列化的二进制流,因为Socket只能以二进制流的形式进行传输。DeSerialiZeBinary()方法该方法是在客户端接收信息时,将二进制流反序列化为对象,并返回反序列化后的对象,这样,便于在指定的控件上显示接收的信息。(7)ClaSSUSerInfo类该类用于记录当前QQ用户的编号、IP地址、端口号、用户名称和用户状态。(8)ClaSSUSerS类该类主要是将服务器端所有注册的用户信息存储到base类的InnerLiSt列表中。这样,当用户注册或登陆时,可以将该列表中的信息发给当前在线的所有用户,以改变QQ窗体的显示情况。(9)Video类该类主要是一个API的视频类。主要是通过调用API的视频类的函数,来打开摄像头,进行数据的读取。打开摄像头之后,还可以在本地进行拍照以及录像等功能。4客户端模块的详细设计及实现客户端注册模块的设计注册模块主要是在客户端用户第一次使用UDP局域网聊天程序的时候,对当前用户进行注册,并将注册的信息发送给服务器端进行记录。当注册成功后,就将返回的服务器端的ID、端口号和姓名等信息写入名为Server.ini文件中,保存在本地的系统目录中。主要是为了方便下次登录的时候判断用户是否进行了注册。如果用户注册了,在登录的时候就读取本地的Server.ini文件,获得服务器端的ip地址和端口号。客户端就可以根据获得的服务器端的IP地址和端口号,与服务器建立通信。客户端通过服务器端的验证后即可登录成功。注册窗体运行结果如图4-1所示。图4-1客户端注册窗体在注册模块中应用了INI文件,以及获取Windows路径的技术,它们都是利用API函数实现的,所以应在命名空间中添加uSing(1)INI文件①创建INI文件创建INI文件主要应用了API函数WritePrivateProfileStringO,在应用API函数前,首先要对其进行声明。②读取INI文件读取INI文件主要应用了API函数Getprivateprofilestring(),在应用API函数前,首先要对其进行声明。(2)获取Windows路径获取Windows路径应用了API函数的GetWindoWSDireCtory(),在应用API函数前,首先要对其进行声明。(1)、新建一个Windows窗体,命名为F_SerSetup.cs,主要用于实现用户的注册功能,该窗体主要用到了TeXtBoX和UDPSoCketI控件。(2)、在输入完服务器的IP地址和注册用户的用户名和密码等注册信息后,确保两次输入的密码要一致,然后单击“确定”按钮,将通过自定义控件UdPSoCketI的Send()方法,将注册信息以二进制流的形式发送给服务器端进行注册。注册成功后,服务器端将返回一个消息,告诉客户端已经注册成功,然后就可以进入到登陆窗口。(3)、在自定义控件的DataArrival事件中,利用托管调用DataArrival事件,并在该控件的线程上,用指定的参数对其进行异步托管。(4)、托管对DataArrival事件进行异步执行,用于获取服务器端所返回的消息,当返回的是注册成功消息时,创建一个INI文件,并写入服务器的IP地址、端口号和用户名称,关闭注册窗体。将INI文件保存在本地的系统目录下。用户在下一次登陆的时候,是要读取该INI文件,取得服务器的IP地址和端口号,然后就可以向服务器发送登陆请求。获得服务器的验证通过后,就可以成功的登陆了。客户端登陆模块设计登陆模块主要是将用户名和密码发送到服务器端进行验证,当服务器端有该用户时,将返回一个登陆成功的消息,通过该消息,将关闭登陆窗体,进入QQ窗体。登陆窗体运行结果如图4-2所示。图4-2客户端登陆窗体在UDP协议的监听事件中通过开启一个线程,来实现局域网信息的发送和接收。要想创建一个子线程,需要实例化一个Thread类型的对象。子线程创建完后,可以使用线程的StartO方法开启当前线程。当子线程使用完之后,可以使用Thread对象的Sleep(0)方法将主线程睡眠,然后调用线程的trd.Abort()方法终止当前线程。(1)新建一个Windows窗体,命名为F_Logon.cs,将窗体的FormBorderStyle属性设为None,去掉窗口的边框,使窗口看起来更加的美观大方。该窗体主要实现客户端的登陆功能。该窗体用到的主要控件有PictureBox和TextBox,分别用于显示登陆窗体的背景和输入登陆用户的密码。(2)在登陆窗体加载时,首先在Windows目录中查找S文件,当该文件不存在时,调用注册窗体;否则,在INI文件中读取服务器的IP地址和端口号。(3)单击窗体的“登陆”按钮,该按钮通过窗体加载所获取的服务器IP和端口号,将用户名和密码以二进制流的形式发送给服务器端。再根据该IP地址和端口号与服务器建立通信,把用户的用户名和密码发送给服务器进行验证。验证通过后,用户就可以进行登录了。(4)在自定义控件UDPSoCketI的DataArrival事件中,利用托管调用DataArrival事件,并在该控件的线程上,用指定的参数对其进行异步托管。(5)托管对DataArrival事件进行异步执行,用于获取服务器端所返回的消息,当返回的是登陆成功消息时,存储服务器端返回的ID值,关闭登陆窗体,进入客户端QQ窗体。如果验证不通过,就不能进行登录。客户端QQ模块设计QQ模块主要显示当前已注册的所有用户的名称,并根据用户的在线情况,设置用户名称前的图标样式。QQ窗体运行结果如图4-3所示。图4-3客户端QQ窗体在本窗体中使用InnerLiSt列表记录当前已注册用户的信息,并将InnerLiSt列表中的信息添加到treeview1控件中。treeviewI控件上同级节点的连接线已经去掉,这样使各个图标看起来更加的美观。InnerList用于存储项目的ArrayList对象,它是CollectionBase对象中的一个属性,可以通过该属性的Add()和Remove()方法向列表中添加和移除元素。具有在线和离线的功能。当用户在线时,就设置亮度的图标,当用户离线时,就设置成灰色的图标。当点击离线时,UDP协议将关闭监听。显示的所有的用户都是离线的状态。此时,不能给其他用户发送消息。此外,还具有系统托盘图标的功能,当最小化程序时,程序将缩小为右下角的系统图标。系统托盘图标上还具有右键菜单的功能。另外,当该QQ窗体移动到屏幕顶端时,还可以实现自动隐藏的功能。(1)新建一个Windows应用程序,将默认创建的Windows窗体命名为F_Clinent.cs,将窗体的FormBorderStyle属性设为FixeDialog,主要用于实现系统的登陆功能。该窗体用到的主要控件有PictureBox和Treeview,主要功能是用于显示QQ窗体的背景图片和将控件的边框设为无。还用到了ComboBox1控件,该控件主要是用于设置用户的上线和离线状态。(2)在QQ窗体加载时,首先要调用登陆窗体,当登陆窗体验证成功后,发送消息给服务器端,返回所有注册的用户信息。然后再根据用户的在线和离线状态,在Treeview上设置用户的图标。(3)自定义方法GetUserList(),通过udpSocket1的控件的Send()方法将消息发送到服务器端,用于获取服务器端已注册的用户消息。(4)利用UdPSoCketI控件的DataArrival事件,对服务器端发送的消息进行监听,以实现客户端与远程客户端的通信功能。当监听到有远程客户端发送消息过来时,就自动在treeView1控件中遍历节点查找消息接收对应的节点,然后就自动打开该聊天窗体,将接收到的信息显示在该窗体上。(5)GetUserList()方法用于遍历服务器端的所有用户,根据用户的当前状态,以图片的形式在Treeview控件中显示用户的在线状态。(6)GetMsg()方法用于获取客户端所发送的消息,根据信息容量的大小,以不同的接收方式存储信息,并在接收信息后,遍历窗体列表,当窗体列表中有相应的接收窗体时,将信息添加到窗体的显示控件中;否则,重新调用消息发送窗体,将接收信息显示在该窗体的显示控件上。(7)自动隐藏的功能主要是使用的timer控件来实现的。就是每毫秒执行一次,获取鼠标在屏幕的坐标点,当鼠标在当前窗体内,并且窗体的TOP属性小于0时,就设置窗体的TOP属性值为0;当窗体的上边框与屏幕的顶端的距离小于5时,就将QQ窗体隐藏到屏幕的顶端。当窗体隐藏之后,将鼠标移动到窗体内的时候,窗体就立刻显示出来。关键的代码如下;privatevoidtimer1_Tick(objectsender,EventArgse){pp=newPoint(Cursor.Position.X,;//获取鼠标在屏幕的坐标点RectangleRects=newRectangle(this.Left,this.Top,this.Left+this.Width,this.Top+this.Height);〃存储当前窗体在屏幕的所在区域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃当鼠标在当前窗体内,并且窗体的Top属性小于0this.ToP=0;〃设置窗体的Top属性为0else//当窗体的上边框与屏幕的顶端的距离小于5时if(this.Top>-5&&this.Top<5&&!(Win32API.PtInRect(refRects,pp)))this.Top=5-this.Height;〃将QQ窗体隐藏到屏幕的顶端}(8)系统托盘图标主要是使用notifyIcon控件来实现的。托盘图标的右键菜单使用的是COnteXtMenuStriP控件。右键菜单具有上线、离线和退出等功能。上线是通过开启UPD控件的监听功能,然后读取数据库的用户信息,将在线和不在线的用户信息显示到treeview1控件上。离线是通过关闭UPD控件的监听功能,停止服务。然后将所有的用户设置成离线的状态。此时,用户不能与其他用户进行通信,只有再次上线,才能与其他用户进行通信。(9)QQ窗体上ComboBoX1上的的上线和离线功能主要也是通过开启或者关闭UDPSocket控件来实现的。当为离线时,就是关闭UDPSocket控件,并把所有的用户图标都设置为灰色即可。(10)当在用户头像上双击某一个在线用户的图标时,即可打开该用户的聊天窗口。然后在文本框输入文本信息发送,就可以与该用户进行文本信息的聊天。点击该窗口上的语音、视频和文件传输的按钮,还可以与该用户进行点对点的语音、视频和文件传输。客户端消息发送模块设计消息发送模块主要用于实现客户端与远程客户端的消息通信。不但具有具有文本聊天的功能,还具有点对点的语音、视频和文件传输等功能,此外,还可以利用本地的摄像头就行录像和拍照,还可以进行字体的设置,QQ表情的发送以及图片的发送等功能。消息发送窗体运行结果如图4-4所示。图4-4客户端聊天窗体(1)在用Socket发送消息时,只能以二进制流的形式进行发送,并且Socket发送的内存流不能大于1024个字节。当发送的消息大于1024个字节时,就需要对信息进行分流发送。QQ表情以及图片的发送也是把它们放在发送框里面,经过序列化成二进制流的消息,当做信息来发送。对方接收到后,再将消息反序列化成对象,再在接收框上面显示出来就可以了。(2)视频功能的实现,主要是使用API函数,通过读取摄像头的数据,取得照片,然后保存在本地系统目录中,然后再读取已保存的照片,将照片发送给远程的客户端进行显示。远程的客户端主要是将接收到的照片也保存在本地目录中,然后再读取保存的照片显示在上方的PiCtureBoX中,就实现了视频的功能。(3)语音的实现,主要是使用微软提供的的DirectXAPI中的DireCtSound来实现。先是通过耳机采集到语音,然后再将语音传输出去,客户端接收到语音后,就将语音进行播放。(4)文件传输的实现,跟文本信息的发送有点类似。也是要以文件流的形式进行传输。传输前,先将要传输的文件序列化成二进制流的形式,然后再进行传输。当文件比较大时,就要进行分块传输。(1)新建一个Windows窗体,命名为F_Chat.cs,用于显示用户发送或接收的信息。该窗体主要用到了PiCtureBox、RichTextBox>UDPSoCket、Timer、toolStrip、Button等控件。PictureBox主要是用于进行视频通信显示双方的视频。上方的PictureBox显示的是对方的视频,下方的PictureBox显示的是自己的视频。Timer控件主要是用于视频信息的发送。RichTextBox控件主要是用于显示接收的和发送的文本信息。toolStrip控件主要是作为语音、视频和文件传输的按钮使用。UDPSocket控件主要用于消息的发送和接收,利用udpSocket1控件的DataArrival事件,对远程客户端所发送的消息进行监听,以便执行相应的操作。(2)单击消息发送窗体中的“发送”按钮,先是将文本信息转换成二进制流的形式,然后根据rich_Input文本框中的信息大小,以不同方式,将文本信息以二进制流的形式进行发送。当信息小于1024字节时,可以直接进行发送。当信息大于1024个字节时,就要将信息先进行拆分,以分块的形式进行发送。当信息发送结束后,再向远程客户端发送一个消息,通知对方消息已经发送完毕。然后再将发送出去的消息显示在当前窗体的RichTextBox显示文本框中。(3)“视频”按钮主要的实现过程是,首先打开视频设备,设置摄像头的一些基本参数,然后将设置的基本信息发送给远程的客户端,请求远程客户端进行视频连接。然后启动timer1控件。该控件就是将从摄像头拍到的保存在本地系统目录中的照片,以每秒的速度发送给远程的客户端。远程客户端默认是将图片保存在C盘根目录下。当照片大于1024个字节时,就将照片进行分块发送。因为在进行视频通信时,是要将照片连续不断的发送出去,远程客户端接收到照片后,再不断的在PiCtureBoX中更新照片,然后才会达到“视频”的效果。因此发送的照片的数据量相对的比较大,所以为了减少网络的拥堵,减少发送的数据量。对发送出去的照片进行了压缩之后,再发送出去是很有必要的。在本程序中,API函数从摄像头拍照到的照片是位图的格式。原始的大小是90K左右。图片没压缩之前,每次都要发送90k左右的数据量,所以相对来说,要发送的数据量是比较大的。这样就给传输造成了一定的拥堵。所以对方看到的“视频”就会显得比较的“卡”,并不是那么的流畅。对方看到的视频,就像是在放幻灯片一样,感觉好像是将图片一张一张的贴上去的一样,一卡一卡的。所以,将图片进行压缩,减少数据的传输量是非常有必要的。所以,在发送图片之前,要先对图片进行了压缩处理。然后再将处理后的图片发送出去。经过图片压缩算法压缩后,图片的大小由原来的90K的,变成了现在的14K左右。图片的格式由原来的位图格式,变成了JPG的格式。虽然图片的格式改变了,但是对于传输并没有造成影响。反而因为压缩的质量非常好,这样只需要将JPG格式的图片发送给远程的客户端就可以了。现在每次只需要发送14K左右的数据量就可以了,相比原来的90K的数据量,数据量小了很多。这样就大大的减少了发送的信息量。这样,相比于原来没有经过压缩处理的图片来说,视频就不会显得那么的卡了。(4)在录像的时候因为录像占用的资源比较的大,所以在进行录像的时候,就会显得很卡。为了减少资源的占用,所以采用了多线程的技术。就是为录像“功能”单独开辟了一个线程来处理录像。录制出来的录像的格式为avi的格式。录像的关键代码如下:///<summary>///录像///</summary>要保存avi文件的路径</param>publiCvoidKinesCope(stringpath){IntPtrhBmp=Marshal.StringToHGlobalAnsi(path);VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_DRIVER_CONNECT,0,hBmp.ToInt32());VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_SEQUENCE,0,0);}(5)使用本地的摄像头进行拍照也相对的比较简单,只要调用API函数即可实现。拍摄的照片是默认的保存在本地的C盘根目录下。关键代码如下:///<summary>///拍照///</summary>〃/ <param 要保存bmp文件的路径<∕param>publicvoidGrabImage(IntPtrhWndC,stringpath){IntPtrhBmp=Marshal.StringToHGlobalAnsi(path);VideoAPI.SendMessage(lwndC,VideoAPI.WM_CAP_SAVEDIB,0,hBmp.ToInt32());}(6)语音的实现,主要有以下的几个步骤:①语音采集采集的作用就是从麦克风中获取数据,这里采用的是DireCtSound类来实现这个技术。DirectSound是微软提供的的DirectXAPI的一部分。它能以极低的时延播放声音,使应用程序可以高度利用资源。所谓的录音,就是将采集自麦克风的模拟信号转换成数字信号(ADC),一般麦克风只提供模拟信号。一般声卡采集到的数据会被存放到缓存区后进行处理,如果是集成声卡,那就是先把数据放在内存中后再处理。WAVE格式WAVE是录音时用的标准的WINDOWS文件格式,扩展名为“WAV”,使用DirectSound采集的WAV声音,其音频数据是按照PCM(脉冲编码调制,对连续变化的模拟信号进行抽样、量化和编码产生的数据,0和1的组合)调制后放入缓冲区的。WAVE文件格式采用RIFF文件格式结构,对PCM数据和其它一些音频信息进行相应的编排,从而最终形成的WAVE文件才能被音频播放器识别,才能进行播放。缓冲区指针缓冲区是存放音频数据的地方,并且它还提供了两个指针:读指针和捕捉指针。它们的位置按照相对于缓冲区起始位置的偏移量计算。读指针位于当前已经被完全捕捉到缓冲区的数据末尾。捕捉指针位于当前将要从硬件中复制的数据块的末尾。如果想从缓冲区中读取数据,则只能从已经完全写入缓冲区的数据中读取,也就是说只能从偏移量小于读指针的地方读取。缓冲区通知大家应该都知道时间相同的音频文件,WAVE文件会比其它格式的音频文件大得多,这是因为WAVE文件没有对数据进行压缩。如果录音的时候,不限制缓冲区大小,那么录制很短的时间可能就会占用很多内存,说不定不过多久,1G内存就不够用了。因此必须对缓冲区的大小进行限制,而且当缓冲区满了之后,还可以重新从缓冲区起始处开始,用新的数据覆盖旧的数据。那旧的数据怎么办呢?如果不想丢失旧的数据,那就得在旧的数据被覆盖之前,将它转移到其它地方。如何才能在旧的数据没有被覆盖之前,将它转移走呢?微软提供了一个解决办法:“通知”。可以在缓冲区中的某些位置处设置通知,当读指针到达通知位置的时候,就会触发相应的事件执行转移操作。有点像操作系统中的“响应中断”。录音大致过程如下:1>设置PCM格式,设置相关的参数,如:采样频率、量化位数等。2>创建WAVE文件.数据还没开始采集,就先创建文件是因为RIFF结构的WAVE文件除了音频数据之外,还有其它数据,比如音频格式、格式长度等类似于文件头的数据。有了文件头后,接下来就只需要把接收到的数据添加在这个后面就好了。3>建立设备对象,建立缓冲区对象。4>设置缓冲区通知,设置通知被触发后的事件。5>准备就绪后,就可以开始录音了。6>当通知被触发后,建立一个新的线程来处理数据转移的事件。(建立一个新的线程,就是为了防止录音过程被中断)。7>录音结束,写入WAV文件尾。这样一个可以播放的WAVE文件就OK了。与录音不同的是,录音需要建立一个WAVE文件来存储这些采集到的数据,而在语音聊天中,则不需要存储,当采集到一些数据后,就立刻发送出去,因此也不需要开辟很大的空间来存放PCM数据。语音聊天基本的步骤如下:1>设置PCM格式,设置相关的参数,如:采样频率、量化参数等。2>建立采集用的设备对象,建立采集用的缓冲区对象。3>设置缓冲区通知,设置通知被触发后的事件。通知是用于缓冲区的读指针达到某预设位置时触发通知事件,提醒可以对某部分的数据进行传送了。4>开始采集语音。5>当通知被触发后,建立一个新的线程来处理数据传送的事件。(建立一个新的线程,就是为了防止采集过程被中断。)语音传输就是将采集到的语音通过UDP协议传输到其他的主机上。大致的流程如下:.建立socket对象,在实例化这个对象的时候设置参数为UDP协议。.绑定本机的IP和端口,因为一个主机可能会有不止一个IP地址,如回发地址:和局域网地址:202.193.#.#。为了增加可用性,这里选择绑定到任何本机可用的IP地址(IPAddreSS.Any),而端口约定默认为8000。.启动监听线程,来监听网络。采用的是异步的方式,以便获得更好的系统响应度。.发送的关键代码是:Client.SendTo(capturedata,epServer);〃传送语音语音播放当对方将语音通过网络传输到本机时,就可以进行实时播放了。因为声音播放是从缓冲区中获取声音数据的,因此必须先将获取到的数据写入缓冲区,然后再调用相应的方法来播放。大致的思路如下:利用MemoryStream来代表这个接收缓冲区。设置两个表示指针位置的字段:privateintintPoSWrite=0;//内存流中写指针位移privateintintPoSPlay=0;//内存流中播放指针位移当接收到数据后,则移动写指针,移动的长度为接收到的数据长度。利用一个字段表示通知大小:privateintintNotifySize=5000;当写指针的位置达到通知大小,则执行播放操作,然后移动播放指针到刚才的通知的位置。如果当前写指针的位移与将要写入到缓冲区的数据大小相加后超过缓冲容量的,则进行摩尔运算,实现循环的效果。(7)文件传输的实现,分别定义了文件发送管理类(SendFileManager),文件接收管理类(ReceiveFileManager),文件发送类(UdpSendFile)和文件接收类(UdpRecieveFile),以便实现尽量简单的就可以使用它们。文件传输中的发送和读写文件都是基于异步的,实现了对大文件的分块发送。与前面的文本信息的发送比较的类似,因为传输的是二进制流,所以传输前要先将文件进行序列化成二进制流的形式,再进行传输。只要知道了对方的IP地址,本地需要开启一个端口进行监听,文件接收方也需要开启一个端口进行监听,看是否有文件流到达本地。如果有文件流到达本地后,就进行读取接收。与传输的过程刚好是相反的,是要将二进制流的信息反序列化成文件对象。接收的文件默认放在接受文件端得根目录下。当给对方发送文件的时候,同时给对方发送一个消息,提示对方自己已经给对方发送了一个文件。在文件发送的时候,也独立开辟了一个线程来处理。文件接收的时候也开辟的一个线程来处理接收。这样,可以提高系统的效率,加快文件传输的速度。服务器端模块的详细设计与实现服务器端控制台窗体概述该窗体是客户端与远程客户端相互通信的一个中转站,并且在该窗体上显示已注册的所有用户信息,包括注册的ID、IP地址、端口号、姓名、状态,并显示用户的在线状态,4是表示在线,12是表示不在线。服务器端控制台窗体运行结果如图5-1所示。图5-1服务器端控制台窗体服务器端控制台窗体技术分析在本模块中使用了BinaryFOrmatter对象,该对象是以二进制格式将对象或整个连接对象序列化或反序列化。服务器端控制台窗体实现过程(1)新建一个Windows窗体,命名为F_Server.cs,主要用于实现系统的登陆功能,该窗体用到的主要控件有LiStView和UDPSOCket。(2)在控制台窗体的菜单栏中选择“控制台/开始服务”命令,打开UDP协议的监听。然后再选中“控制台/关闭服务”命令,即可关闭UDP协议的监听。(3)在UDPSocket1的控件的DataArrival事件中,对客户端发送的消息进行监听,并根据发送的消息对数据库进行相应的操作。(4)RegiSterUSerO方法将客户端注册的信息添加到数据库中,并更新用户列表。(5)InsertUser()方法的主要功能是将用户注册的相关信息添加到数据库的tb_CurreneyUse数据表中,并更新用户列表。(6)UPdateUSerLiStO方法的主要功能是将刚刚注册成功的用户信息,发送给当前所有在线的用户,并告知其他用户,当然已有人注册。(7)UserLogin()方法的主要功能是当前用户上线时,更改tb-CurreneyUser数据表中相关用户的标识,并更新用户的在线状态。系统特色及关键技术(1)当QQ窗体上边框拖动到屏幕顶端时,QQ窗体会自动隐藏。实现这一过程,使用的是timer1控件对鼠标进行实时监控,用API函数PtInRect()判断当前鼠标是否在QQ窗体上,如果在,判断窗体的Top属性值,并进行相应的操作。代码如下:Privatevoidtimer1_Tick(objectsender,EventArgse){pp=newPoint(Cursor.Position.X,;//获取鼠标在屏幕的坐标点RectangleRects=newRectangle(this.Left,this.Top,this.Left+this.Width,this.Top+this.Height);〃存储当前窗体在屏幕的所在区域if((this.Top<0)&&Win32API.PtInRect(refRects,pp))〃当鼠标在当前窗体内,并且窗体的Top属性小于0this.Top=0;//设置窗体的Top属性为0else//当窗体的上边框与屏幕的顶端的距离小于5时if(this.Top>-5&&this.Top<5&&!(Win32API.PtInRect(refRects,pp)))this.Top=5-this.Heigh匕//将QQ窗体隐藏到屏幕的顶端}(2)为了使程序窗口的界面看起来更加的美观、大方。对所有的窗体都进行了皮肤的加载。皮肤的加载技术相对的来说比较的简单。只要在程序中引入相应的皮肤加载库,然后将相关的文件放到当前程序的目录下,即可实现动态加载皮肤了。(3)该程序中还使用的系统托盘图标的功能。该功能的实现主要是使用了notifyIcon1控件实现。托盘图标还具有右键菜单的功能。菜单上具有在线、离线、和退出的功能。(4)此外,还对窗体图标已经可执行程序的图标都进行插入“QQ”图片,使程序看起来更加的美观、大方。(5)本程序还对客户端和服务器端程序分别进行了打包。使用户在使用的时候能够比较方便的安装。打包使用的是VS2005中的“安装和部署”功能来进行打包的。打包的时候,只要将程序使用的到的相关的动态链接库和可执行文件进行打包即可。到了其他机器上,只要单击运行“安装程序”即可自动的快速的在本地完成QQ聊天程序的安装。然后点击快捷方式,即可方便的进行登录了。(6)语音、视频和文件传输是本程序最大的特色,也是在本系统开发中最难开发的、技术含量最多的模块。7结论经过2个多月紧张的毕业设计,采用C#做的局域网QQ聊天软件已基本完成,系统的基本功能已经实现,测试运行也比较正常。该系统操作简便、易于使用、用户界面友好,所以具有比较好的易用性。但是在开发的过程中,也遇到了不少的困难和挑战:(1)刚开始碰到的一个比较大的问题就是,服务器IP地址的确定的问题。因为学校分配给每个人的IP地址不是固定的,是经常变化的,而在开始调试程序的时候是指定了固定的本地IP地址进行调试的,所以在调试程序的过程中经常出现连不上服务器的情况。开始的时候,以为是自己程序的问题,后来经过调试才发现原来是服务器IP地址经常变动的原因,才导致客户端连接不上服务器,所以才导致客户端不能正常的登录。因为刚开始不知道有回环地址,所以每过一两天,当IP地址一改变的时候,就得改变程序中的所有的固定了的IP地址,这样做非常的麻烦,有时候因为疏漏,漏改了一两处的话,就会导致连不上服务器的情况。后来,经过到网上,查询,知道了本机的回环地址:,调试程序就方便多了,就不用经常改变程序中的IP地址了。(2)另外,就是在做视频的时候,也遇到了比较大的麻烦。刚开始时,是可以实现了视频,但是发现本地摄像头拍摄到的图像是“歪”的,就是在视频控件上看到的图像是“歪”的,后来,在网上不断的寻找有关方面的资料,最终把问题给解决了。另外一个问题是,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论