首页 UDP局域网QQ聊天程序设计说明书

UDP局域网QQ聊天程序设计说明书

举报
开通vip

UDP局域网QQ聊天程序设计说明书UDP局域网QQ聊天程序设计说明书 摘 要 随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。 本设计开发的是一个局域网QQ聊天软件,运用软件工程的设计流程,使用现在比较普遍和流行的C#语言,采用面向对象的方法,综合运用数据库编程技术、多线程开发技术、网络通讯技术,以Microsoft Visual Studio 2005作为系统前台应用程序开发工具,Microsoft SQL Server 2000作为后台...

UDP局域网QQ聊天程序设计说明书
UDP局域网QQ聊天程序设计说明书 摘 要 随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。 本设计开发的是一个局域网QQ聊天软件,运用软件工程的设计流程,使用现在比较普遍和流行的C#语言,采用面向对象的方法,综合运用数据库编程技术、多线程开发技术、网络通讯技术,以Microsoft Visual Studio 2005作为系统前台应用程序开发工具,Microsoft SQL Server 2000作为后台数据库管理系统,在Windows XP平台下进行开发。 本局域网QQ聊天软件采用服务器端/客户端(C/S)模式。客户端采用UDP与服务器连接,客户端之间也是通过UDP互相通讯。服务器端主要用于开启和关闭UDP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的监听服务,还可以查看局域网内已注册的所有的用户以及他们的在线状态。客户端分为注册窗口、登录窗口、QQ窗体主界面以及聊天界面。服务器端要先开启监听服务,客户端才可以进行登录,然后才可以与其他登录的在线用户进行文本信息的聊天,还可以进行点对点的语音聊天,视频聊天和文件传输,还可以进行拍照和录像等。此外,还对该软件进行了皮肤的加载以及打包成安装源。 该软件运行稳定,界面美观、操作简便。在局域网内部使用该局域网QQ聊天软件,可以方便人与人之间的沟通、交流;可以大大提高企业的工作效率;拉近人与人之间的关系。 关键词:局域网;聊天软件;客户端;服务器端;UDP协议 毕业设计(论文) 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 用纸 Abstract With the development of networking technology and the living demand of people, chatting on network is more and more acceptable by people. Internet chat has become an important tool to transmission of information and exchange of feelings in our life, it brings a great convenience. The topic of this paper is going to talk about that to develop the local area network QQ chat software. This local area network chat software using the design stream of the software project, using the C# language which is very common and popular, using the object-oriented approach, the technology of the database programming, multi-threading development technology and the network communication technology, makes Microsoft Visual Studio 2005 as the front application design tool, Microsoft SQL Server 2000 are used as the background DBMS( the database management system ), and it was programmed in the Windows XP System. The local area network QQ chat software uses the server and client (C/S) mechanism. And the client connects the server using UDP, and they communicate each other by UDP. Server-side is mainly used to open and close the UDP protocol monitoring service, and you can also look over all the registered users and their online status whom in the local area network. Client is divided into registration window, the login window, the main QQ form and the chat form. If the client wants to log in, the server monitoring service must first open the listening service, then the client can chat with the others which have already logged, and also can voice chat, video chat and files transfers, and also can take pictures and videos. In addition, the software has been load the beautiful skin and package into the installation source. This software has an interface aesthetics, stable operation, simple operation. Using QQ software in the LAN internal can help people to communicate with others easily, can greatly improve the efficiency of the enterprises, close relationships between people. Key Words: Local Area Network; Chat Software; Client; Server-side; UDP protocol 毕业设计(论文)报告用纸 目 录 引言 ................................................................................................................... 1 1 系统概述与需求 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 ............................................................................... 2 1.1 系统概述 .........................................................................................................................2 1.2 需求分析 .........................................................................................................................2 1.2.1功能需求…………………………………………………………………………………3 1.2.2性能需求…………………………………………………………………………………3 1.3 可行性分析 .....................................................................................................................4 2 系统总体设计 .............................................................................................. 5 2.1 相关开发技术的原理性说明 ..........................................................................................5 2.1.1.NET Framework和C#…………………………………………………………………..5 2.1.2SQL Server 2005………………………………………………………………………….6 2.1.3UDP协议简介……………………………………………………………………………6 2.1.4Socket简介……………………………………………………………………………….6 2.2 系统功能结构 .................................................................................................................7 2.3 业务流程图 .....................................................................................................................8 2.4 程序运行环境 .................................................................................................................8 3 数据库以及类库的详细设计与实现 ........................................................... 9 3.1 数据库的创建 .................................................................................................................9 3.1.1数据库分析………………………………………………………………………………9 3.1.2数据库创建………………………………………………………………………………9 3.1.3数据库概念设计………………………………………………………………………....9 3.1.4数据库逻辑结构设计…………………………………………………………………..9 3.1.5文件夹组织结构………………………………………………………………………..10 3.2 类库的设计 ................................................................................................................... 10 4 客户端模块的详细设计及实现 ................................................................ 12 4.1客户端注册模块的设计 ................................................................................................. 12 4.1.1客户端注册模块概述…………………………………………………………………..12 4.1.2客户端注册模块技术分析……………………………………………………………..13 4.1.3客户端注册模块实现过程……………………………………………………………..13 4.2 客户端登陆模块设计.................................................................................................... 14 4.2.1客户端登陆模块概述…………………………………………………………………..14 4.2.2客户端登陆模块技术分析……………………………………………………………..14 4.2.3客户端登陆模块实现过程……………………………………………………………..14 毕业设计(论文)报告用纸 4.3 客户端QQ模块设计……………………………………………………………………15 4.3.1客户端QQ模块概述…………………………………………………………………..15 4.3.2客户端QQ模块技术分析……………………………………………………………..15 4.3.3客户端QQ模块实现过程……………………………………………………………..16 4.4 客户端消息发送模块设计 ............................................................................................ 17 4.4.1客户端消息发送模块概述……………………………………………………………..17 4.4.2客户端消息发送模块技术分析………………………………………………………..18 4.4.3客户端消息发送模块实现过程………………………………………………………..18 5 服务器端模块的详细设计与实现 ............................................................. 23 5.1 服务器端控制台窗体概述 ............................................................................................ 23 5.2 服务器端控制台窗体技术分析 .................................................................................... 23 5.3 服务器端控制台窗体实现过程 .................................................................................... 23 6 系统特色及关键技术 ................................................................................ 24 7 结论 ........................................................................................................... 25 谢 辞 ............................................................................................................. 28 参考文献 ......................................................................................................... 29 附 录 ............................................................................................................. 30 毕业设计(论文)报告用纸 第 1 页 共 42 页 引言 在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具。网络版的聊天软件种类繁多,如QQ、OICQ、MSN等,给人们带来了很大的方便,也使世界好象一下子缩小了,不管在哪里,只要能上网,打开这些软件,就可以给朋友发信息,不管对方是否也同时在线,只要知道对方的号码。但是这些聊天软件也存在以下不足:用户必须连接Internet;用户在工作时容易沉迷于网络聊天。为了方便单位企业内部的信息交流,减少不必要的财力和人力资源浪费,开发一个局域网聊天软件是非常必要的。 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。计算机应用技术在日益的普及,网络也遍及到生活的每个角落,很好的利用这些资源,将为人们的工作和学习,带来极大的方便和提高工作效率。 现在,企业、机关、学校都建立起了自己的局域网,在局域网,虽然可以通过文件共享的方式进行通讯,但单单使用这种方式,是非常不方便的,首先,在局域网里的网上邻居里,只能看到机器名,不清楚对方是谁,也不知道对方机器里有什么资源可以共享,而且,当局域网的机器很多时,这种方式更加麻烦。于是,就想到做一个在局域网里的聊天软件,在局域网里,可以通过它,实现在局域网里方便的联络,进行文件传输,消息的发布,还可以语音、视频等。所以,开发一个局域网里的基于C/S模式的QQ聊天软件,是十分必要。 在学校建立起校园网里,局域网聊天系统可以起到方便同学之间,教师之间,师生之间的相互联络,这样,不用上Internet,可以节省资源,在学校这个大环境里,就可以同学之间联系,联络感情,促进同学之间的友谊,学生可以通过它来与不同寝室的同学,教师讨论问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。并能最大限度地利用现有的网络资源,极大地提高工作效率。为了适应校园网的建设,实现校园网内进行消息发布,学生交流,师生交流,网上作业等功能。 在公司企业建立起的局域网里,应用于局域网内企业(组织)内部成员之间的交流领域,在没有因特网的支持下也可以进行即时通讯,亦因此使之更安全、更高效;同时因为它界面简洁实用,没有娱乐功能,所以简单易用,是企业(组织)成员更加专注于工作,减少不必要的财力和人力资源浪费。 因此,本毕业设计开发了一个局域网的QQ聊天软件。该聊天软件分为服务器端和客户端,采用的是C#语言,在Windows XP系统下,使用的开发工具是Microsoft Visual Studio 2005,运行于.NET平台上,使用SQL Server 2000作为后台的数据库管理。为实现和方便客户端之间的通信,在客户端进行了人性化的界面设计,用户可以进行注册,注册后,凭借用户名和密码就可以登陆到QQ聊天界面,然后就可以与其他的在线用户进 毕业设计(论文)报告用纸 第 2 页 共 42 页 行局域网内部的文本聊天、语音聊天、视频聊天和文件的传输。 1 系统概述与需求分析 1.1 系统概述 该局域网QQ聊天软件操作简单方便、界面简洁。该系统分为客户端和服务器端。前台为客户端,包括的主要功能有用户注册、用户登陆、文字聊天、文件传输、语音聊天和视频聊天等功能。后台为服务器端,主要功能包括:数据库的建立、查看用户的状态、管理用户的资料、开启和关闭服务器的监听等功能。服务器端直接与数据库相连,服务器端要先开启监听,然后客户端登陆的时候要与服务器端进行通信,服务器端进行验证客户端的用户名和密码。客户端经过服务器端的验证后,才可以登陆成功。本软件还对客户端的各个窗口进行了皮肤加载,使界面看起来更加的美观、大方。本局域网QQ聊天软件还具有系统托盘和右键菜单的功能。每个客户端只能进行一次并且只需注册一次。用户登录成功之后,可以看到局域网内所有的在线和不在线的的注册用户。用鼠标双击打开某一个在线的用户的聊天窗口,就可以与该用户进行文字信息的互发与接收,可以利用本地的摄像头进行录像和拍照,还可以与对方进行点对点的视频、语音和传输文件等操作。本系统运行比较的稳定、安全可靠。此外,本软件还对源程序进行了打包成安装源,便于用户使用的时候进行安装。安装源也分为客户端和服务器的安装源。一般的局域网用户只需要安装客户端即可。 1.2 需求分析 近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的不断扩大,业务量的不断增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部。为了解决上述矛盾,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以随时的与局域网内部的用户进行即时消息的传递,召开网络会议,进行语音视频和文件的传输等,有利于提高工作消息效率,同时又保护了企业内部信息的安全性。 本局域网QQ聊天软件主要是采用Microsoft Visual Studio 2005结合SQL Sever 2000数据库技术,采用C#语言来实现各功能模块的开发。开发出来的软件必须结构比较的合理、功能比较的齐全、使用起来比较的方便。该局域网QQ聊天软件开发的重点和难点是客户端和服务器端与数据库的连接,建立连接后还要保证通信的畅通性和正确性。此外要实现在两个客户端之间实现点对点的文件传输,语音聊天以及视频等功能,也是本局域网QQ聊天软件开发的难点。此外,还要着重处理好各模块间的划分以及模块间的连接。在开发中应注意系统性能的优化,数据库的安全和优化,尽可能的提高系统的安全性和整个系统的运行的稳定性。同时,开发出来的软件系统还必需功能完备、安全性高、易于维护和使用,操作也要简单、方便,界面也要简洁、美观、大方。 毕业设计(论文)报告用纸 第 3 页 共 42 页 1.2.1功能需求 网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具。网络版的聊天软件种类繁多,如QQ、OICQ、MSN等,实现了随时随地上网聊天,给人们带来了很大的方便。但是这些聊天软件也存在以下不足:用户必须连接Internet;用户在工作时容易沉迷于网络聊天。为了方便单位企业内部的信息交流,减少不必要的财力和人力资源浪费,开发一个局域网聊天软件是非常必要的。 开发该局域网聊天软件需要完成以下的几个要求,以便于用户进行操作。这样才能使该软件易学易用、更加的人性化。 (1) 合理的设计数据库 尽量合理地减少数据库数据的冗余,使重复的数据保持在最小限度,这样将不必要的多占用存储空间,减少产生混乱影响的危险,还能提高计算机的运行速度。 (2) 设计出友好的界面 界面的友好与否是用户评价一个软件优劣的重要方面之一,使用户有一个良好的心情。 另外窗口界面的各个控件布局要合理,美观。要充分的利用Microsoft Visual Studio.Net 2005提供的强大的功能。 (3) 根据局域网对QQ聊天软件的要求,本QQ聊天软件需要实现以下的目标: ? 操作简单方便、界面简洁美观 ? 每个客户端只能注册一次 ? 可以在局域网中实现文字的传输 ? 可以实现多用户的信息通信 ? 可以实现两个用户之间的点对点的语音聊天 ? 可以实现两个用户之间的点对点的视频聊天 ? 可以使用本地的摄像头的进行录像和拍照 ? 可以实现两个用户之间点对点的文件的传输和接收 ? 系统运行要比较的稳定、安全可靠 1.2.2性能需求 (1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器未启动等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。 (2)易操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。 (3)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后 毕业设计(论文)报告用纸 第 4 页 共 42 页 的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。 1.3 可行性分析 可行性研究的目的就是要用最小的代价在尽可能短的时间内确定问题是否能够解决。可行性研究可以在较高的层次以比较抽象的方式讨论系统的分析和设计。本局域网QQ聊天软件的可行性研究主要从技术可行性、经济可行性、开发可行性和现有的条件四个方面来进行讨论。 (1)技术可行性 随着国内软件开发的日益发展壮大,各种中小企事业单位和学校等部门已具备独立开发各种类型的应用软件的能力,能够满足不同行业的特别的需求。而本局域网QQ聊天软件其在组织关系上并不存在着很大的复杂性,繁琐性,从整个系统的技术构成上来看,它是属于一个与数据库应用有关的软件,使用的是UDP协议。只要对C#语言比较的熟悉,对UDP协议以及Microsoft的API函数相对比较了解的话,开发出这样的一个系统,并不存在很大的困难。 (2)经济可行性 对于整个系统而言,并不需要花费太多的经费。只要一两个人或者一个小团队,即可以完成系统的开发。 (3)开发可行性 本局域网QQ聊天软件采用的是Microsoft Visual Studio.Net 2005作为开发工具, 利用SQL Server 2000对数据库表进行存储,提供数据之间的操作。首先Microsoft Visual Studio.Net 2005是一个开放的协作式系统,可以连接许多比较常用的数据库。其次它具有可视化的开发环境,使代码的编写比较的直观,并且在可视化环境下的调试和维护也相对比较容易。再次Microsoft Visual Studio.Net 2005提供了大量的控件,这既丰富了应用程序的表达能力,也加快了项目的开发速度。 (4)现有设备及实验条件: ? 计算机: Genuine Intel(R) CPU 2140 @1.60GHz 1G内存,160G硬盘 ? 系统: Microsoft Windows XP Professional 版本 2002 Service Pack 3 ? 软件: Microsoft Visual Studio 2005 Microsoft SQL Server 2000 以上的设备,对于开发出一个功能比较完备,性能比较完善的局域网QQ聊天软件,已经足够了。 毕业设计(论文)报告用纸 第 5 页 共 42 页 2 系统总体设计 2.1 相关开发技术的原理性说明 2.1.1.NET Framework和C# 本局域网QQ聊天软件的开发采用的是C/S结构,基于.NET开发环境下,使用C#语言进行开发。C#是一种精确、简单、类型安全、面向对象的语言,是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与java有着惊人的相似;它包括了诸如单一继承,接口,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。 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中。 .NET Framework类似于Java虚拟机,它不但使Internet上运行的应用程序更容易被开发,而且也可用于开发运行于Windows桌面上的传统业务应用程序。它为创建、部署以及管理安全、强大、高效的应用程序提供了前所未有的最大支持。.NET Framework是一个创建、部署和运行应用程序的多语言平台环境,.NET支持的语言使用的基类库由.NET Framework类库(FCL)提供。C#是Microsoft公司设计的一种编程语言。它松 毕业设计(论文)报告用纸 第 6 页 共 42 页 散地基于C/C++,并且有很多方面和Java类似。Microsoft是这样描述C#的:C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。 2.1.2SQL Server 2005 SQL Server 数据平台 SQL Server 是一个全面的、集成的、端到端的数据解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,它为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。SQL Server 2005 为IT专家和信息共作者带来了强大的、熟悉的工具,同时减少了在从移动设备到企业数据系统的多平台上创建、部署、管理及使用企业数据和分析应用程序的复杂度。通过全面的功能集、和现有系统的集成性、以及对日常任务的自动化管理能力,SQL Server 2005 为不同规模的企业提供了一个完整的数据解决方案。 2.1.3UDP协议简介 本局域网QQ聊天软件使用的是UDP协议。用户数据报协议(User Datagram Protocol)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。是一个简单的面向数据报的传输层协议,IETF RFC 768是UDP的正式规范。UDP 协议基本上是 IP 协议与上层协议的接口。UDP 协议适用端口分别运行在同一台设备上的多个应用程序。 与 TCP 不同,UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比TCP负载消耗少。 UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、路由信息协议(RIP)和某些影音串流服务等等。 2.1.4Socket简介 选定Windows XP平台开发网络通信程序,可以选择Windows的Sockets编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Windows sockets无疑是进行网络编程的利器。所有的Windows Sockets实现都支持流套接口和数据报套接口。应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。 Socket,简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。 具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端 毕业设计(论文)报告用纸 第 7 页 共 42 页 被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读取Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信。 一般的Socket网络编程的函数调用步骤如下: (1)创建套接字 应用程序在使用套接字前,首先必须创建一个套接字,以便系统分配相应的资源给它。 (2)指定本地地址 当一个套接字被创建后,存在一个名字空间(地址族),但它没有被命名。需要将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地相关。 (3)建立套接字连接 即开启监听功能。监听远程客户端的请求。 (4)数据传输 当一个连接建立以后,就可以进行数据传输了。分为数据的发送和接收。 (5)关闭套接字连接 也就是关闭监听,并释放分配给该套接字的资源。 2.2 系统功能结构 根据局域网QQ聊天软件的特点,可以将其分为客户端和服务器端两个部分进行设计。客户端主要用于用户的注册、登陆和信息的发送、语音、视频和文件的传输等;服务器端主要用于记录用户注册的用户名、密码、IP地址、端口号以及用户在线的状态等信息,并作为客户端向远程客户端发送信息的一个中转站。 -1所示: UDP局域网聊天程序客户端与服务器端的功能结构图如图2 图2-1局域网QQ聊天程序功能结构图 毕业设计(论文)报告用纸 第 8 页 共 42 页 2.3 业务流程图 UDP局域网聊天程序是由客户端和服务器端组合而成的,业务流程图如图2-2所示。 客户端登陆的时候,先判断用户是否已经进行过了注册。如果用户已经注册后,则直接进入到登陆窗口。如果用户没有注册过,则跳转到注册窗口,让用户先进行注册。用户注册需要填写服务器IP地址、端口号、用户名和密码等信息。注册完成后,客户端与远程服务器取得通信,将注册的信息发送到远程的服务器端进行注册保存。客户端在本地将生成一个Server.ini文件,该文件主要是记录服务器的IP地址和端口号以及注册用户的用户名。当用户下一次登陆的时候就是通过读取Server.ini文件,来取得服务器的IP地址和端口号,然后再根据该IP地址和端口号与服务器建立通信。注册完成后,然后就会跳转到登陆窗口。用户只要输入正确的用户名和密码,就可以登陆成功。就可以与服务器端建立通信。登陆之后,就进入到了QQ界面。双击某一个在线的用户,就可以与该用户进行聊天、语音、视频和文本的传输。 图2-2 局域网QQ聊天软件业务流程图 2.4 程序运行环境 本局域网QQ聊天软件运行的环境具体如下: (1)系统开发平台:Microsoft Visual Studio 2005 (2)系统开发语言:C# (3)数据库管理系统软件:Microsoft SQL Server 2000 毕业设计(论文)报告用纸 第 9 页 共 42 页 (4)运行平台:Windows XP (5)运行环境:Microsoft.NET Framework SDK v2.0 3 数据库以及类库的详细设计与实现 3.1 数据库的创建 在开发应用程序时,对数据库的操作是必不可少的,数据库设计是根据程序的需求及其实现功能所制定的。 3.1.1数据库分析 本局域网QQ聊天软件后台数据库主要是用于记录注册人员的编号、用户名、密码、IP地址、端口号和在线和离线的状态等信息。使用Microsoft SQL Server 2000 作为后台数据库。数据库命名为db_MyQQData,其中包含了一张数据表db_CurrencyUser,用于存储当前已注册的用户的基本信息。 3.1.2数据库创建 数据库db_MyQQData的具体创建步骤如下: (1)选择“开始/所有程序/Microsoft SQL Server/企业管理器”命令,打开SQL Server Enterprise Manager 数据库窗体。 (2)在SQL Server Enterprise Manager 数据库窗体的(local)(Windows NT)中,用鼠标右键单击“数据库”文件,在弹出的快捷菜单中选择“新建数据库”命令,打开“数据库属性”对话框,在该对话框的“名称”文本框中输入要创建的数据库名称“db_MyQQData”,单击“确定”按钮创建数据库。 3.1.3数据库概念设计 在QQ用户登陆时,为了可以在服务器端返回所有注册用户的信息,可以在服务器端的数据库中创建一个用户注册表,用于记录注册用户的IP地址、端口号、在线状态、用户名和密码等基本信息。用户注册表的实体E-R图如图3-1所示。 图3-1 用户注册表的实体E-R图 3.1.4数据库逻辑结构设计 根据上面设计好的E-R图,可以在数据库中创建相应的数据表,此外根据注册用户 毕业设计(论文)报告用纸 第 10 页 共 42 页 的实体E-R图来创建数据表。 数据库创建完成后,在db_MyQQData数据库的下拉节点的“表”节点上单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,将在SQL Server Enterprise Manager 数据库窗体中弹出“新表”对话框。 在“新表”对话框的“列名”中输入ID、IP、Port、Name、PassWord和Sign字段,将其数据类型分别设置为int、varchar(20)、int、varchar(20)、varchar(20)和int,并将ID字段设为主键和自动编号,然后在各“列”的“描述”文本框中对应字段进行中文解释。 字段名称和数据类型设置完成后,单击保存按钮,弹出“选择名称”窗口,在该窗口中输入创建数据表的名称db_CurrencyUser,单击“确定”按钮,就完成了对本局域网QQ聊天软件后台数据库的创建。 3.1.5文件夹组织结构 在本系统中创建了五个解决方案和一个类库,分别是客户端解决方案、表情方案、语音和文件传输方案以及服务器端解决方案,还有一个名为QQClass的类库。为了便于对它们进行操作,将客户端解决方案和类库添加到了服务器端解的决方案中。文件夹组织结构图如图3-2所示。MyQQClient解决方案主要是用于客户端各个窗口的开发,MyQQServer解决方案主要是用于服务器端后台的用户信息管理平台界面的开发,QQClass类库主要是对UDP协议进行封装,还有定义其他一些类。ImageListPopupDemo 解决方案主要是用于实现QQ表情的发送的,MatureVoice解决方案主要是用于实现语音的,UdpSendFile解决方案主要是用于实现文件的传输功能的。 图3-2 文件夹组织结构图 3.2 类库的设计 在本局域网QQ聊天软件中,因为在后台服务器端的用户信息管理平台以及前台的客户端的注册窗口、登录窗口、QQ界面窗口以及聊天窗口都需要用到UDP协议。所以本程序中,将UDP协议封装成了一个控件,主要是为了便于客户端和服务器端的调用,并且将UDP控件和自定义类存储在了QQClass类库中。当需要使用到UDP协议的时候,只需要在相应的窗口中加入UDPSocket控件,然后设置UDPSocket控件的相关的属性即可。下面对QQClass类库中的UDPSocket控件和其他的类分别进行说明。 毕业设计(论文)报告用纸 第 11 页 共 42 页 (1)UDPSocket控件 该控件主要是将UDP协议中的IP地址和端口号以及开启或者关闭的状态以控件的形式进行设置,并自定义一个了DataArrival事件,用于对主机的端口号进行监听,以获取远程计算机发送过来的消息。 在自定义控件上制作了localHost、localPort、active属性,以及DataArrival事件。localHost用于设置服务器端的IP地址;localPort属性用于设置端口号;active属性是一个Bool型,可以控制端口号是否处于监听状态。 UDPSocket控件中包含了方法OpenSocket和CloseSocket()方法分别用于打开和关闭UDP协议端口的监听功能,并在监听关闭的同时关闭用于接收信息的子线程。 Listener()方法用于实现主机端口号的监听功能,主要是将IP地址和端口号以网络端点进行存储,然后创建一个新的端口号,再设置接收缓冲区和发送缓冲区的大小。此外,还创建了一个线程,主要是用于获取当前接收到的信息,就是将获取的远程信息转换成二进制流。在线程打开时,将GetUDPData()方法所接收的信息传递给线程的委托。 GetUDPData()方法是在获取远程消息时,将消息转发给UDPSocket控件的DataArrival事件,可以通过该事件将消息发送给远程客户端。 Send()方法用于将主机获取的消息,通过IP地址和端口号发送给远程客户端。 通过以上的方法,便制作完成了一个UDPSocket控件。如图3-3所示: 图3-3 UDP控件属性图 (2)Publec_Class类 该类用于记录服务器端和客户端的基本信息,并通过自定义的方法MyHostIP()获取服务器端的所有IP地址,通过自定义方法Get_Windows()获取Windows目录。 (3)ClassForms类 该类将获取的的窗体在InnerList列表中进行添加和移除操作,在列表中查找相应的窗体。 (4)ClassMsg类 毕业设计(论文)报告用纸 第 12 页 共 42 页 该类主要是用枚举型的元素指定消息发送的命令、消息类型、消息发送的状态等。其中,发送的消息命令包括了用户的注册、用户注册结束、用户登录、用户登录结束上线、用户列表、打开视频、关闭视频、下线等命令;发送的消息类型包括了无类型、发送命令、发送消息、发送文件等。此外,该类还用来记录发送方和接收方的发送编号、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 客户端模块的详细设计及实现 4.1客户端注册模块的设计 4.1.1客户端注册模块概述 注册模块主要是在客户端用户第一次使用UDP局域网聊天程序的时候,对当前用户进行注册,并将注册的信息发送给服务器端进行记录。当注册成功后,就将返回的服 毕业设计(论文)报告用纸 第 13 页 共 42 页 务器端的ID、端口号和姓名等信息写入名为Server.ini文件中,保存在本地的系统目录中。主要是为了方便下次登录的时候判断用户是否进行了注册。如果用户注册了,在登录的时候就读取本地的Server.ini文件,获得服务器端的ip地址和端口号。客户端就可以根据获得的服务器端的IP地址和端口号,与服务器建立通信。客户端通过服务器端的验证后即可登录成功。注册窗体运行结果如图4-1所示。 图4-1 客户端注册窗体 4.1.2客户端注册模块技术分析 在注册模块中应用了INI文件,以及获取Windows路径的技术,它们都是利用API函数实现的,所以应在命名空间中添加 using System.Runtime.InteropServices命名空间。下面对其进行详细介绍。 (1)INI文件 ? 创建INI文件 创建INI文件主要应用了API函数WritePrivateProfileString(),在应用API函数前,首先要对其进行声明。 ? 读取INI文件 读取INI文件主要应用了API函数Getprivateprofilestring(),在应用API函数前,首先要对其进行声明。 (2)获取Windows路径 获取Windows路径应用了API函数的GetWindowsDirectory(),在应用API函数前,首先要对其进行声明。 4.1.3客户端注册模块实现过程 (1)、新建一个Windows窗体,命名为F_SerSetup.cs,主要用于实现用户的注册功能,该窗体主要用到了TextBox和UDPSocket1控件。 (2)、在输入完服务器的IP地址和注册用户的用户名和密码等注册信息后,确保 毕业设计(论文)报告用纸 第 14 页 共 42 页 两次输入的密码要一致,然后单击“确定”按钮,将通过自定义控件udpSocket1的Send()方法,将注册信息以二进制流的形式发送给服务器端进行注册。注册成功后,服务器端将返回一个消息,告诉客户端已经注册成功,然后就可以进入到登陆窗口。 (3)、在自定义控件的DataArrival事件中,利用托管调用DataArrival事件,并在该控件的线程上,用指定的参数对其进行异步托管。 (4)、托管对DataArrival事件进行异步执行,用于获取服务器端所返回的消息,当返回的是注册成功消息时,创建一个INI文件,并写入服务器的IP地址、端口号和用户名称,关闭注册窗体。将INI文件保存在本地的系统目录下。用户在下一次登陆的时候,是要读取该INI文件,取得服务器的IP地址和端口号,然后就可以向服务器发送登陆请求。获得服务器的验证通过后,就可以成功的登陆了。 4.2 客户端登陆模块设计 4.2.1客户端登陆模块概述 登陆模块主要是将用户名和密码发送到服务器端进行验证,当服务器端有该用户时,将返回一个登陆成功的消息,通过该消息,将关闭登陆窗体,进入QQ窗体。登陆窗体运行结果如图4-2所示。 图4-2 客户端登陆窗体 4.2.2客户端登陆模块技术分析 在UDP协议的监听事件中通过开启一个线程,来实现局域网信息的发送和接收。要想创建一个子线程,需要实例化一个Thread类型的对象。子线程创建完后,可以使用线程的Start()方法开启当前线程。当子线程使用完之后,可以使用Thread对象的Sleep(0)方法将主线程睡眠,然后调用线程的trd.Abort()方法终止当前线程。 4.2.3客户端登陆模块实现过程 (1)新建一个Windows窗体,命名为F_Logon.cs,将窗体的FormBorderStyle属性设为None,去掉窗口的边框,使窗口看起来更加的美观大方。该窗体主要实现客户端的登陆功能。该窗体用到的主要控件有PictureBox和TextBox,分别用于显示登陆窗体的背景和输入登陆用户的密码。 毕业设计(论文)报告用纸 第 15 页 共 42 页 (2)在登陆窗体加载时,首先在Windows目录中查找Server.int文件,当该文件不存在时,调用注册窗体;否则,在INI文件中读取服务器的IP地址和端口号。 (3)单击窗体的“登陆”按钮,该按钮通过窗体加载所获取的服务器IP和端口号,将用户名和密码以二进制流的形式发送给服务器端。再根据该IP地址和端口号与服务器建立通信,把用户的用户名和密码发送给服务器进行验证。验证通过后,用户就可以进行登录了。 (4)在自定义控件UDPSocket1的DataArrival事件中,利用托管调用DataArrival事件,并在该控件的线程上,用指定的参数对其进行异步托管。 (5)托管对DataArrival事件进行异步执行,用于获取服务器端所返回的消息,当返回的是登陆成功消息时,存储服务器端返回的ID值,关闭登陆窗体,进入客户端QQ窗体。如果验证不通过,就不能进行登录。 4.3 客户端QQ模块设计 4.3.1客户端QQ模块概述 QQ模块主要显示当前已注册的所有用户的名称,并根据用户的在线情况,设置用户名称前的图标样式。QQ窗体运行结果如图4-3所示。 图4-3 客户端QQ窗体 4.3.2客户端QQ模块技术分析 在本窗体中使用InnerList列表记录当前已注册用户的信息,并将InnerList列表中的信息添加到treeview1控件中。treeview1控件上同级节点的连接线已经去掉,这样使各个图标看起来更加的美观。InnerList用于存储项目的ArrayList对象,它是 毕业设计(论文)报告用纸 第 16 页 共 42 页 CollectionBase对象中的一个属性,可以通过该属性的Add()和Remove()方法向列表中添加和移除元素。具有在线和离线的功能。当用户在线时,就设置亮度的图标,当用户离线时,就设置成灰色的图标。当点击离线时,UDP协议将关闭监听。显示的所有的用户都是离线的状态。此时,不能给其他用户发送消息。此外,还具有系统托盘图标的功能,当最小化程序时,程序将缩小为右下角的系统图标。系统托盘图标上还具有右键菜单的功能。另外,当该QQ窗体移动到屏幕顶端时,还可以实现自动隐藏的功能。 4.3.3客户端QQ模块实现过程 (1)新建一个Windows应用程序,将默认创建的Windows窗体命名为F_Clinent.cs,将窗体的FormBorderStyle属性设为FixeDialog,主要用于实现系统的登陆功能。该窗体用到的主要控件有PictureBox和Treeview,主要功能是用于显示QQ窗体的背景图片和将控件的边框设为无。还用到了comboBox1控件,该控件主要是用于设置用户的上线和离线状态。 (2)在QQ窗体加载时,首先要调用登陆窗体,当登陆窗体验证成功后,发送消息给服务器端,返回所有注册的用户信息。然后再根据用户的在线和离线状态,在Treeview上设置用户的图标。 (3)自定义方法GetUserList(),通过udpSocket1的控件的Send()方法将消息发送到服务器端,用于获取服务器端已注册的用户消息。 (4)利用udpSocket1控件的DataArrival事件,对服务器端发送的消息进行监听,以实现客户端与远程客户端的通信功能。当监听到有远程客户端发送消息过来时,就自动在treeView1控件中遍历节点查找消息接收对应的节点,然后就自动打开该聊天窗体,将接收到的信息显示在该窗体上。 (5)GetUserList()方法用于遍历服务器端的所有用户,根据用户的当前状态,以图片的形式在Treeview控件中显示用户的在线状态。 (6)GetMsg()方法用于获取客户端所发送的消息,根据信息容量的大小,以不同的接收方式存储信息,并在接收信息后,遍历窗体列表,当窗体列表中有相应的接收窗体时,将信息添加到窗体的显示控件中;否则,重新调用消息发送窗体,将接收信息显示在该窗体的显示控件上。 (7)自动隐藏的功能主要是使用的timer控件来实现的。就是每毫秒执行一次,获取鼠标在屏幕的坐标点,当鼠标在当前窗体内,并且窗体的TOP属性小于0时,就设置窗体的TOP属性值为0;当窗体的上边框与屏幕的顶端的距离小于5时,就将QQ窗体隐藏到屏幕的顶端。当窗体隐藏之后,将鼠标移动到窗体内的时候,窗体就立刻显示出来。关键的代码如下; private void timer1_Tick(object sender, EventArgs e) { System.Drawing.Point pp=new Point(Cursor.Position.X,Cursor.Position.Y); 毕业设计(论文)报告用纸 第 17 页 共 42 页 //获取鼠标在屏幕的坐标点 Rectangle Rects = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height);//存储当前窗体在屏幕的所在区域 if ((this.Top < 0) && Win32API.PtInRect(ref Rects, pp)) //当鼠标在当前窗体内,并且窗体的Top属性小于0 this.Top = 0; //设置窗体的Top属性为0 else //当窗体的上边框与屏幕的顶端的距离小于5时 if (this.Top > -5 && this.Top < 5 && !(Win32API.PtInRect(ref Rects, pp))) //将QQ窗体隐藏到屏幕的顶端 this.Top = 5 - this.Height; } (8)系统托盘图标主要是使用notifyIcon控件来实现的。托盘图标的右键菜单使用的是contextMenuStrip控件。右键菜单具有上线、离线和退出等功能。上线是通过开启UPD控件的监听功能,然后读取数据库的用户信息,将在线和不在线的用户信息显示到treeview1控件上。离线是通过关闭UPD控件的监听功能,停止服务。然后将所有的用户设置成离线的状态。此时,用户不能与其他用户进行通信,只有再次上线,才能与其他用户进行通信。 (9)QQ窗体上comboBox1上的的上线和离线功能主要也是通过开启或者关闭UDPSocket控件来实现的。当为离线时,就是关闭UDPSocket控件,并把所有的用户图标都设置为灰色即可。 (10)当在用户头像上双击某一个在线用户的图标时,即可打开该用户的聊天窗口。然后在文本框输入文本信息发送,就可以与该用户进行文本信息的聊天。点击该窗口上的语音、视频和文件传输的按钮,还可以与该用户进行点对点的语音、视频和文件传输。 4.4 客户端消息发送模块设计 4.4.1客户端消息发送模块概述 消息发送模块主要用于实现客户端与远程客户端的消息通信。不但具有具有文本聊天的功能,还具有点对点的语音、视频和文件传输等功能,此外,还可以利用本地的摄像头就行录像和拍照,还可以进行字体的设置,QQ表情的发送以及图片的发送等功能。消息发送窗体运行结果如图4-4所示。 毕业设计(论文)报告用纸 第 18 页 共 42 页 图4-4 客户端聊天窗体 4.4.2客户端消息发送模块技术分析 (1)在用Socket发送消息时,只能以二进制流的形式进行发送,并且Socket发送的内存流不能大于1024个字节。当发送的消息大于1024个字节时,就需要对信息进行分流发送。QQ表情以及图片的发送也是把它们放在发送框里面,经过序列化成二进制流的消息,当做信息来发送。对方接收到后,再将消息反序列化成对象,再在接收框上面显示出来就可以了。 (2)视频功能的实现,主要是使用API函数,通过读取摄像头的数据,取得照片,然后保存在本地系统目录中,然后再读取已保存的照片,将照片发送给远程的客户端进行显示。远程的客户端主要是将接收到的照片也保存在本地目录中,然后再读取保存的照片显示在上方的PictureBox中,就实现了视频的功能。 (3)语音的实现,主要是使用微软提供的的DirectX API中的DirectSound来实现。先是通过耳机采集到语音,然后再将语音传输出去,客户端接收到语音后,就将语音进行播放。 (4)文件传输的实现,跟文本信息的发送有点类似。也是要以文件流的形式进行传输。传输前,先将要传输的文件序列化成二进制流的形式,然后再进行传输。当文件比较大时,就要进行分块传输。 4.4.3客户端消息发送模块实现过程 (1)新建一个Windows窗体,命名为F_Chat.cs,用于显示用户发送或接收的信息。该窗体主要用到了PictureBox、RichTextBox、UDPSocket、Timer、toolStrip、Button等控件。PictureBox主要是用于进行视频通信显示双方的视频。上方的PictureBox显示的是对方的视频,下方的PictureBox显示的是自己的视频。Timer控件主要是用于视频信 毕业设计(论文)报告用纸 第 19 页 共 42 页 息的发送。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的格式。录像的关键代码如 毕业设计(论文)报告用纸 第 20 页 共 42 页 下: /// /// 录像 /// /// 要保存avi文件的路径 public void Kinescope(string path) { IntPtr hBmp = 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盘根目录下。关键代码如下: /// /// 拍照 /// /// 要保存bmp文件的路径 public void GrabImage(IntPtr hWndC, string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); VideoAPI.SendMessage(lwndC, VideoAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32()); } (6)语音的实现,主要有以下的几个步骤: ? 语音采集 采集的作用就是从麦克风中获取数据,这里采用的是DirectSound类来实现这个技 术。DirectSound是微软提供的的DirectX API的一部分。它能以极低的时延播放声音, 使应用程序可以高度利用资源。所谓的录音,就是将采集自麦克风的模拟信号转换成数 字信号(ADC),一般麦克风只提供模拟信号。一般声卡采集到的数据会被存放到缓存 区后进行处理,如果是集成声卡,那就是先把数据放在内存中后再处理。 ?WAVE格式 WAVE是录音时用的标准的WINDOWS文件格式,扩展名为“WAV”,使用 DirectSound采集的WAV声音,其音频数据是按照PCM(脉冲编码调制,对连续变化 的模拟信号进行抽样、量化和编码产生的数据,0和1的组合)调制后放入缓冲区的。 毕业设计(论文)报告用纸 第 21 页 共 42 页 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> 建立采集用的设备对象,建立采集用的缓冲区对象。 毕业设计(论文)报告用纸 第 22 页 共 42 页 <3> 设置缓冲区通知,设置通知被触发后的事件。通知是用于缓冲区的读指针达到某预设位置时触发通知事件,提醒可以对某部分的数据进行传送了。 <4> 开始采集语音。 <5> 当通知被触发后,建立一个新的线程来处理数据传送的事件。(建立一个新的线程,就是为了防止采集过程被中断。) ? 语音传输 就是将采集到的语音通过UDP协议传输到其他的主机上。大致的流程如下: 1. 建立socket对象,在实例化这个对象的时候设置参数为UDP协议。 2. 绑定本机的IP和端口,因为一个主机可能会有不止一个IP地址,如回发地址:127.0.0.1 和局域网地址:202.193.#.#。为了增加可用性,这里选择绑定到任何本机可用的IP地址(IPAddress.Any),而端口约定默认为8000。 3. 启动监听线程,来监听网络。采用的是异步的方式,以便获得更好的系统响应度。 4.发送的关键代码是:Client.SendTo(capturedata, epServer);//传送语音 ? 语音播放 当对方将语音通过网络传输到本机时,就可以进行实时播放了。因为声音播放是从缓冲区中获取声音数据的,因此必须先将获取到的数据写入缓冲区,然后再调用相应的方法来播放。大致的思路如下: ?利用MemoryStream来代表这个接收缓冲区。 ?设置两个表示指针位置的字段: private int intPosWrite = 0;//内存流中写指针位移 private int intPosPlay = 0;//内存流中播放指针位移 ?当接收到数据后,则移动写指针,移动的长度为接收到的数据长度。 ?利用一个字段表示通知大小:private int intNotifySize = 5000; ?当写指针的位置达到通知大小,则执行播放操作,然后移动播放指针到刚才的通知的位置。 ?如果当前写指针的位移与将要写入到缓冲区的数据大小相加后超过缓冲容量的,则进行摩尔运算,实现循环的效果。 (7)文件传输的实现,分别定义了文件发送管理类(SendFileManager),文件接收管理类(ReceiveFileManager),文件发送类(UdpSendFile)和文件接收类(UdpRecieveFile),以便实现尽量简单的就可以使用它们。文件传输中的发送和读写文件都是基于异步的,实现了对大文件的分块发送。与前面的文本信息的发送比较的类似,因为传输的是二进制流,所以传输前要先将文件进行序列化成二进制流的形式,再进行传输。只要知道了对方的IP地址,本地需要开启一个端口进行监听,文件接收方也需要开启一个端口进行监听,看是否有文件流到达本地。如果有文件流到达本地后,就进行读取接收。与传输的过程刚好是相反的,是要将二进制流的信息反序列化成文件对象。 毕业设计(论文)报告用纸 第 23 页 共 42 页 接收的文件默认放在接受文件端得根目录下。 当给对方发送文件的时候,同时给对方发送一个消息,提示对方自己已经给对方发送了一个文件。在文件发送的时候,也独立开辟了一个线程来处理。文件接收的时候也开辟的一个线程来处理接收。这样,可以提高系统的效率,加快文件传输的速度。 5 服务器端模块的详细设计与实现 5.1 服务器端控制台窗体概述 该窗体是客户端与远程客户端相互通信的一个中转站,并且在该窗体上显示已注册的所有用户信息,包括注册的ID、IP地址、端口号、姓名、状态,并显示用户的在线状态,4是表示在线,12是表示不在线。服务器端控制台窗体运行结果如图5-1所示。 图5-1 服务器端控制台窗体 5.2 服务器端控制台窗体技术分析 在本模块中使用了BinaryFormatter对象,该对象是以二进制格式将对象或整个连接对象序列化或反序列化。 5.3 服务器端控制台窗体实现过程 (1)新建一个Windows窗体,命名为F_Server.cs,主要用于实现系统的登陆功能,该窗体用到的主要控件有ListView和UDPSocket。 (2)在控制台窗体的菜单栏中选择“控制台/开始服务”命令,打开UDP协议的监听。然后再选中“控制台/关闭服务”命令,即可关闭UDP协议的监听。 (3)在UDPSocket1的控件的DataArrival事件中,对客户端发送的消息进行监听,并根据发送的消息对数据库进行相应的操作。 毕业设计(论文)报告用纸 第 24 页 共 42 页 (4)RegisterUser()方法将客户端注册的信息添加到数据库中,并更新用户列表。 (5)InsertUser()方法的主要功能是将用户注册的相关信息添加到数据库的tb_CurreneyUser数据表中,并更新用户列表。 (6)UpdateUserList()方法的主要功能是将刚刚注册成功的用户信息,发送给当前所有在线的用户,并告知其他用户,当然已有人注册。 (7)UserLogin()方法的主要功能是当前用户上线时,更改tb-CurreneyUser数据表中相关用户的标识,并更新用户的在线状态。 6 系统特色及关键技术 (1)当QQ窗体上边框拖动到屏幕顶端时,QQ窗体会自动隐藏。实现这一过程, imer1控件对鼠标进行实时监控,用API函数PtInRect()判断当前鼠标是否使用的是t 在QQ窗体上,如果在,判断窗体的Top属性值,并进行相应的操作。代码如下: private void timer1_Tick(object sender, EventArgs e) { System.Drawing.Poin pp= new Point(Cursor.Position.X,Cursor.Position.Y); //获取鼠标在屏幕的坐标点 Rectangle Rects = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height);//存储当前窗体在屏幕的所在区域 if ((this.Top < 0) && Win32API.PtInRect(ref Rects, pp)) //当鼠标在当前窗体内,并且窗体的Top属性小于0 this.Top = 0;//设置窗体的Top属性为0 else //当窗体的上边框与屏幕的顶端的距离小于5时 if (this.Top > -5 && this.Top < 5 && !(Win32API.PtInRect(ref Rects, pp))) this.Top = 5 - this.Height;//将QQ窗体隐藏到屏幕的顶端 } (2)为了使程序窗口的界面看起来更加的美观、大方。对所有的窗体都进行了皮肤的加载。皮肤的加载技术相对的来说比较的简单。只要在程序中引入相应的皮肤加载库,然后将相关的文件放到当前程序的目录下,即可实现动态加载皮肤了。 (3)该程序中还使用的系统托盘图标的功能。该功能的实现主要是使用了notifyIcon1控件实现。托盘图标还具有右键菜单的功能。菜单上具有在线、离线、和退出的功能。 (4)此外,还对窗体图标已经可执行程序的图标都进行插入“QQ”图片,使程序看起来更加的美观、大方。 (5)本程序还对客户端和服务器端程序分别进行了打包。使用户在使用的时候能够比较方便的安装。打包使用的是VS2005中的“安装和部署”功能来进行打包的。打 毕业设计(论文)报告用纸 第 25 页 共 42 页 包的时候,只要将程序使用的到的相关的动态链接库和可执行文件进行打包即可。到了其他机器上,只要单击运行“安装程序”即可自动的快速的在本地完成QQ聊天程序的安装。然后点击快捷方式,即可方便的进行登录了。 (6)语音、视频和文件传输是本程序最大的特色,也是在本系统开发中最难开发的、技术含量最多的模块。 7 结论 经过2个多月紧张的毕业设计,采用C#做的局域网QQ聊天软件已基本完成,系统的基本功能已经实现,测试运行也比较正常。该系统操作简便、易于使用、用户界面友好,所以具有比较好的易用性。但是在开发的过程中,也遇到了不少的困难和挑战: 因为学(1)刚开始碰到的一个比较大的问题就是,服务器IP地址的确定的问题。校分配给每个人的IP地址不是固定的,是经常变化的,而在开始调试程序的时候是指定了固定的本地IP地址进行调试的,所以在调试程序的过程中经常出现连不上服务器的情况。开始的时候,以为是自己程序的问题,后来经过调试才发现原来是服务器IP地址经常变动的原因,才导致客户端连接不上服务器,所以才导致客户端不能正常的登录。因为刚开始不知道有回环地址,所以每过一两天,当IP地址一改变的时候,就得改变程序中的所有的固定了的IP地址,这样做非常的麻烦,有时候因为疏漏,漏改了一两处的话,就会导致连不上服务器的情况。后来,经过到网上,查询,知道了本机的回环地址:127.0.0.1。后面,调试程序就方便多了,就不用经常改变程序中的IP地址了。 (2)另外,就是在做视频的时候,也遇到了比较大的麻烦。刚开始时,是可以实现了视频,但是发现本地摄像头拍摄到的图像是“歪”的,就是在视频控件上看到的图像是“歪”的,后来,在网上不断的寻找有关方面的资料,最终把问题给解决了。另外一个问题是,就是视频图片的传输。因为本地摄像头拍摄出来的照片比较的大,有90K左右,所以传输的时候,数据量相对的比较大,造成了视频比较的“卡”。所以,就对图片进行压缩之后再进行传输。压缩的效果比较的明显,压缩后,图片的大小只有14K左右,大大的减少了传输的数据量。此外,还对视频的显示独立开辟了一个线程,使视频相对的比较流畅了。在使用多线程的时候,也碰到了一个比较麻烦的问题。就是开辟线程的时候,线程传递的参数是一个函数指针。但是这个函数只能是无参的函数,不能进行多个参数的传递。当函数有多个参数时,就不能进行传递了。后面到网上查找了很多的资料,最终把问题给解决了。就是在定义线程的时候,使用委托的方法,就可以解决参数传递的问题了。另外,录像的时候,也会占用系统比较大的资源。最初的想法也是开辟一个线程来单独处理录像,但是,最后发现,效果并不是那么的明显。这个问题还有待进一步的进行处理。 (3) 第三个遇到的比较大的问题就是做绿色软件的问题。刚开始以为也是像用C++编写的程序一样,只要把可执行文件拷贝到其他机器上,就可以运行了。但是,后来发现不行。因为本程序是在VS2005中采用C#语言进行编写的。要运行.NET平台开 毕业设计(论文)报告用纸 第 26 页 共 42 页 发的程序,本地机器必须要安装有运行环境Microsoft.NET Framework SDK v2.0,程序才可以运行。所以,便到网上进行了查找相关的资料。但是发现,有关这方面的资料相对的来说比较的少,没有找到很满意的答案。后来,也找到了一些制作绿色软件的工具,但是由于时间问题,还没来及进行实践。在以后的学习当中,还会继续进行相关方面的学习。 (4)本聊天系统主要是基于客户端/服务器模式设计开发的,并对服务器端进行了初步的开发。而客户端的设计有很多都需要完善。客户端是给用户使用的,从方便和美观上,还都还有很多需要完善的地方。而且,由于时间关系,客户端还有些功能没有完全。如果要使本系统成为一个实际应用系统并在局域网上实际应用,除了完成客户端的功能外,还应做以下的完善和开发工作: ? 进一步完善底层通讯协议,使能够更好的处理数据的发送和接受。 ? 多线程下的对临界数据访问的问题。 ? 软件的换肤功能还没有完成,只能进行简单的换肤,美观和换肤功能上有待完善。 ? 语音聊天、视频聊天和文件传输的模块都需要进一步的优化。 通过在电脑上通过多个进程的测试和通过两台机器联机测试,本软件基本上实现了预期的的各种功能,基本满足了需求分析提出的各项要求。但是,正如测试本身体现的问题一样,测试本身不能证明程序没有问题,只能说是测试用例能够通过程序的验证。所以,对于本程序,还要通过在以后的使用中,发现问题,加以改进。 在做这次毕业设计之前接触过网络编程方面的知识相对有点少,这次毕业设计是在边学习边实践的基础上完成的。由于时间以及技术上等一些因素,做的结果不太好,与自己原来的设想有些差距。通过学习“计算机网络”自己对网络的基础知识也打下了很好的基础。这次毕业设计可以说是在理解网络的基础上对Windows Socket 编程的一次学习过程,虽然做的不是很好,但也学到了很多知识,对自己以后进行网络方面的开发应该会有很大的帮助。 在毕业设计的初期阶段,主要学习了与本课题相关的理论知识,包括:微软.Net Framework框架结构,Visual Studio2005集成开发环境,C#2.0语言,SQL server2000数据库等一系列相关技术,socket编程技术和多线程开发技术,并完成客户端和服务器端文字信息传递的测试。然后还到网上查找了大量的有关语音、视频和文件传输方面的资料。为开发了做好了前期的准备工作。 设计开发的最基本的应该是扎实的专业知识的掌握,如果没有良好的基本功,就会在设计的过程中遇到很多的麻烦,这些麻烦的根源就是知识水平的局限性,在设计中本人深刻的体会到了这一点。 在查阅大量资料逐渐了解系统需求后,本人编写了系统的任务书,并进行了详细的需求分析。接着便进入了系统详细设计和编码阶段。在这个阶段,由于本人对相关的知 毕业设计(论文)报告用纸 第 27 页 共 42 页 识了解不够透彻以及对开发工具的陌生,系统开发遇到了很多大大小小的问题,比如如何利用多线程、线程池提高系统性能,如何对图片进行压缩,减少传输的数据量等,如何更好地美化界面等问题,但在一次次克服困难的过程中,本人得到了极大的锻炼,基本上掌握了一些的编程技巧,同时也获得了许多宝贵的软件开发经验和技巧,这将为本人今后的学习工作打下了坚实的基础。而这对本人来说是一次丰富的收获。 就是当遇到问题的时候,要沉着冷静,善于分析问题,解决问题,要利用周围一切可以利用的资源,来尽可能的帮助自己把遇到的问题给解决。比如说可以向周围的同学请教,也可以向老师进行请教,还可以到图书馆查找相关的书籍,甚至还可以利用互联网上丰富的资源。 通过本次毕设系统的开发,学习到了很多的东西。不仅了解了UDP协议的通信方式,还懂得了如何在程序中对数据库进行操作。了解了语音、视频和文件传输等功能实现的基本原理。懂得了如何去操作摄像头进行对本地的拍照和录像,还懂得了如何对文件进行分块传送,还懂得了如何进行点对点的语音聊天。另外,在界面的制作方面也学到了许多的东西。比如对窗口进行皮肤的加载,使窗口看起来更加的美观、大方。还学会了系统托盘图标的制作,窗体的隐藏技术等等。还学会了对程序进行打包成安装源等等、总之获益匪浅。 本局域网QQ聊天软件主要的功能:局域网的聊天,语音、视频和文件传输,虽然大体上基本上实现了,但是由于技术方面以及时间方面的限制,比如说视频相对的比较卡,还需要进一步的进行优化。还有,文件传输的时候,没有对显示文件传输的进度等等。不过,在以后的学习当中,本人还会继续的进行研究、学习,争取把本局域网QQ聊天软件做的尽善尽美一点。 这次毕业设计的时间虽然不算太长,但对很多东西有了更深刻的认识。总结如下: ?查阅资料和阅读相关文献的重要性。 ?向老师和同学请教的重要性。 ?利用互联网强大的搜索功能的重要性。 ?勤动手的重要性,在以前总是有“只学不练”的倾向,导致动手能力得不到提高,在这次的一次次编写代码、调试代码的过程中,才明白“代码不是写出来的,是调出来的”的道理。深刻的体会到了“实践是检验真理的唯一标准”这句话的内涵~ ?对待任何事情都要有耐心和恒心,遇到问题要沉着冷静地思考,积极找出症结所在,逐个解决。不能一遇到困难就手足无措,而是要冷静的分析问题,找出问题的根源所在,再利用周围可以利用一切资源,来帮助自己来解决问题。 转眼大学阶段就快要划上句号了。通过这次毕业设计,本人更深刻的认识到了教学实践在大学课程中的重要性,同时也发觉到了自己在理论知识以及动手能力方面还存在许多的不足之处,在以后的工作学习中还需要进一步的加强。以后,本人会努力改进这些不足、不断提高自己的动手实践能力~ 毕业设计(论文)报告用纸 第 28 页 共 42 页 谢 辞 时光匆匆如流水,转眼便是大学毕业时节。离校日期已日趋临近,毕业论文的的完成也随之进入了尾声。从开始进入课题到论文的顺利完成,一直都离不开老师、同学、朋友给我热情的帮助,在这里请接受我诚挚的谢意! 在设计过程中,我通过查阅大量相关的资料,与同学交流经验并不断的自学,同时还向老师请教等等这些方式,使自己学到了不少知识。期间也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作、独立思考的能力,树立了对自己工作能力的信心,相信会对今后的工作学习生活会有非常重要的影响。不仅大大提高了自己的动手能力,还使自己充分体会到了在创造过程中探索的艰难和成功时的喜悦。 在本文结束之际,首先要向我的指导老师孙老师致以崇高的敬意和衷心的感谢。他为人随和热情,治学严谨细心。在我进行专业课程的学习、素材的收集、课题的确立、资料的查阅期间,孙老师都给以的热忱的关怀和细心的指导,感谢他在百忙之中抽出时间并耐心的给我讲解毕业设计中的难点和疑点。在论文的写作和措辞等方面他也总会以“专业标准”来严格要求我,从选题、定题开始,一直到最后论文的反复修改、润色,孙老师始终认真负责地给予我深刻而细致地指导。孙老师不厌其烦,一审再审,大到篇章布局的偏颇,小到语句格式的瑕疵,都一一予以指出帮助我开拓研究思路,精心点拨、热忱鼓励。正是孙老师的无私帮助与热忱鼓励,我的毕业论文才能够得以顺利完成,谢谢孙老师。孙老师严谨的治学态度、渊博的学识、对事业的兢兢业业、不断进取的精神,为我今后的生活及工作树立了榜样,我的点滴进步无不凝结着孙老师的心血。 还要感谢我们班的可亲可爱的同学们,在我遇到问题的时候,是你们耐心的帮我解答;在我遇到困难的时候,是你们给予我莫大的支持与鼓励;在我需要帮助的时候,是你们伸出了热情的双手,让我感受到了在一个大家庭中生活的温暖~ 还要感谢学院的各位任课老师,老师们深厚的学术功底、旺盛的工作热情和平易近人的态度是我学习的榜样。 还要感谢审阅本文的老师们,感谢你们在百忙之中抽出宝贵时间来审阅本文,并期待你们的批评指正。 此外,还要感谢我身在远方的父母~你们给我生活上的关怀和精神上的鼓励是我学习的动力。 在论文完成之际,我的心情无法平静,从课题开始到论文的顺利完成,许多老师、同学、朋友们给了我无尽的帮助。最后,再次向各位老师和同学们给予我的的关心和帮助表示衷心的感谢,在这里请你们接受我诚挚的谢意~ 毕业设计(论文)报告用纸 第 29 页 共 42 页 参考文献 [1] 金华,华进著(C#网络编程技术教程[M](北京:人民邮电出版社,2009 [2] 唐政,房大伟等著(C#项目开发全程实录[M](北京:清华大学出版社,2008 [3] 谭桂华,魏亮等著(Visual C#高级编程范例[M](北京:清华大学出版社,2004 [4] 吕伟臣等著(Visual C# 2005入门与提高[M](北京:清华大学出版社,2006 [5] 刘甲耀,严桂兰等著(C#程序设计教程[M](北京:电子工业出版社,2007 [6] 陈钟(C#编程语言程序设计与开发[M](北京:清华大学出版社,2003 [7] 乔杜里,康韦著(Windows GUI高级编程[M](北京:清华大学出版社,2003 [8] 刘烁,季石磊著(C#编程及应用程序开发教程[M](北京:清华大学出版社,2007 [9] Watton,陈秋萍著(C#2005数据库编程经典教程[M](北京:人民邮电出版社,2007 [10] Pappas Murray著(C#Windows编程[M](北京:人民邮电出版社,2002 毕业设计(论文)报告用纸 第 30 页 共 42 页 附 录 1 配置源程序 1.1附加数据库SQL Server 2000 (1)将MyQQ\MyQQServer\MyQQServer\DataBase文件夹中的扩展名为db_MyQQData_Data.MDF和db_MyQQData_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,在“数据库”数据项上单击鼠标右键,在弹出的快捷菜单中选择“所有任务”/“附加数据库”菜单项。 (3)将弹出“附加数据库”对话框,在该对话框中单击【】按钮,选择所要附加数据库的db_MyQQData_Data.MDF文件,单击【确定】按钮,即可完成数据库的附加操作。 2 使用说明 2.1操作注意事项 (1)当用户第一次运行客户端程序时,将会弹出注册窗口进行注册,用户注册后,再次运行客户端程序时,将直接进行登录,不用再次进行注册。 (2)在一台计算机中,不可以登录两个以上的用户。 (3)在进行视频前,客户端和远程客户端必须打开通信窗口。 (4)在进行录制视频的时候,速度比较的慢。 2.2操作流程 (1)用户首先启动服务器端。单击“控制台”/“开始服务”命令,启动服务器端的UDP协议。要关闭服务器的监听,单击“控制台”/“关闭服务”命令即可; 要退出服务器端后台,点击菜单栏上的“退出”菜单项即可。 (2)在局域网的其它计算机中,启动客户端程序,用户进行注册。 (3)用户注册成功后,自动关闭用户注册窗口,进入登录窗口。 (4)在登录窗口中输入注册时的用户名及密码,单击“登录”按钮,进入QQ窗体。 (5)在“我的QQ”窗体中,双击在线人员的名称,即可弹出聊天窗口。 (6)在文本框中输入聊天的内容,点击发送,即可进行文本信息的聊天。 (7)分别点击聊天窗口左上角的“视频”、“语音”、“文件传输”按钮,即可分别进行视频、语音和文件传输等功能。 3 部分源代码 3.1 UDP控件的实现 using System; using System.ComponentModel; 毕业设计(论文)报告用纸 第 31 页 共 42 页 using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Net.Sockets; using System.Net; using System.Windows.Forms; using System.Threading; namespace QQClass { public partial class UDPSocket : Component { private IPEndPoint ServerEndPoint = null; //定义网络端点 private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Sockets private System.Threading.Thread thdUdp; //创建一个线程 public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port); //定义了一个托管方法 public event DataArrivalEventHandler DataArrival; //通过托管理在控件中定义一个事件 private string localHost = "127.0.0.1"; [Browsable(true), Category("Local"), Description("本地IP地址")] //在“属 性”窗口中显示localHost属性 public string LocalHost { get { return localHost; } set { localHost = value; } } private int localPort = 11000; [Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性 public int LocalPort { get { return localPort; } set { localPort = value; } } 毕业设计(论文)报告用纸 第 32 页 共 42 页 private bool active = false; [Browsable(true), Category("Local"), Description("激活监听")] //在“属性”窗口中显示active属性 public bool Active { get { return active; } set //该属性读取值 { active = value; if (active) //当值为True时 { OpenSocket(); //打开监听 } else { CloseSocket(); //关闭监听 } } } public UDPSocket() { InitializeComponent(); } public UDPSocket(IContainer container) { container.Add(this); InitializeComponent(); } protected void Listener() //监听 { ServerEndPoint = new IPEndPoint(IPAddress.Any,localPort); //将IP 地址和端口号以网络端点存储 if (UDP_Server != null) UDP_Server.Close(); UDP_Server = new UdpClient(localPort); 毕业设计(论文)报告用纸 第 33 页 共 42 页 //创建一个新的端口号 UDP_Server.Client.ReceiveBufferSize = 1000000000; //接收缓冲区大小 UDP_Server.Client.SendBufferSize = 1000000000; //发送缓冲区大小 try { thdUdp = new Thread(new ThreadStart(GetUDPData)); //创建一个线程 thdUdp.Start(); //执行当前线程 } catch (Exception e) { MessageBox.Show(e.ToString()); //显示线程的错误信息 } } private void GetUDPData() //获取当前接收的消息 { while (active) { try { byte[] Data = UDP_Server.Receive(ref ServerEndPoint); // 将获取的远程消息转换成二进制流 if (DataArrival != null) { DataArrival(Data,ServerEndPoint.Address,ServerEndPoint.Port); } Thread.Sleep(0); } catch { } } } private void CallBackMethod(IAsyncResult ar) { 毕业设计(论文)报告用纸 第 34 页 共 42 页 //从异步状态ar.AsyncState中,获取委托对象 DataArrivalEventHandler dn = (DataArrivalEventHandler)ar.AsyncState; //一定要EndInvoke,否则你的下场很惨 dn.EndInvoke(ar); } public void Send(System.Net.IPAddress Host, int Port, byte[] Data) { try { IPEndPoint server = new IPEndPoint(Host, Port); UDP_Server.Send(Data, Data.Length, server); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void OpenSocket() { Listener(); } private void CloseSocket() { if (UDP_Server != null) UDP_Server.Close(); if (thdUdp != null) { Thread.Sleep(30); thdUdp.Abort(); } } } } 毕业设计(论文)报告用纸 第 35 页 共 42 页 3.2 聊天窗口实现的相关函数 #region 打开视频 private void tool_Video_Click(object sender, EventArgs e) { viodeo = new cVideo(pictureBox1.Handle, pictureBox1.Width, pictureBox1.Height); viodeo.StartWebCam(); // 打开视频 ClassMsg msg = new ClassMsg(); msg.sendKind = SendKind.SendCommand; msg.msgCommand = MsgCommand.VideoOpen; msg.Data = Encoding.Unicode.GetBytes(""); IPAddress ip = IPAddress.Parse(((this.Tag as TreeNode).Tag as ClassUserInfo).UserIP); string port = "11005"; string revid = ((this.Tag as TreeNode).Tag as ClassUserInfo).UserID; string sid = Publec_Class.UserID; // 多线程处理视频数据的传输 Thread t = new Thread(delegate() {udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(msg).ToArray()); }); t.IsBackground = true; t.Start(); Voiding = true; SendViod = false; timer1.Enabled = true; panel2.Visible = true; // 显示视频相关的按钮 btnGetVideo.Visible= true ; btnPicture.Visible = true; btnCloseVideo.Visible = true; btnGetVideo.Enabled = true; btnPicture.Enabled = true; btnCloseVideo.Enabled = true; } #endregion #region 处理接收到的视频数据 private void udpSocket1_DataArrival(byte[] Data, IPAddress Ip, int Port) 毕业设计(论文)报告用纸 第 36 页 共 42 页 { DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival); this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port }); } private delegate void DataArrivaldelegate(byte[] Data, System.Net.IPAddress Ip, int Port); private void DataArrival(byte[] Data, System.Net.IPAddress Ip, int Port) //当有数据到达后的处理进程 { // 开辟一个线程来处理接收到的数据 Thread videoThread = new Thread(delegate() { try { ClassMsg msg = new ClassSerializers().DeSerializeBinary((new System.IO.MemoryStream(Data))) as ClassMsg; switch (msg.msgCommand) { case MsgCommand.VideoOpen: Voiding = true; SendViod = false; break; case MsgCommand.Videoing: GetVoid(Data, Ip, Port); break; case MsgCommand.VideoClose: Voiding = false; break; } } catch { } }); videoThread.IsBackground = true; videoThread.Start(); 毕业设计(论文)报告用纸 第 37 页 共 42 页 videoThread.Join(); } #endregion #region 显示远程的视频 private void GetVoid(byte[] Data, System.Net.IPAddress Ip, int Port) { ClassMsg msg = (ClassMsg)new ClassSerializers().DeSerializeBinary(new MemoryStream(Data)); string sid = msg.SID;//发送方用户ID string msgid = msg.msgID;//消息标识,GUID switch (msg.msgCommand) { case MsgCommand.Videoing://发送的消息 { switch (msg.sendState) //消息发送的状态 { case SendState.Start: { FileStream fs = null; try { string FileName = "c:\\Void.jpg"; //设置文件接收路径 fs = File.Create(FileName);//创建文件 fs.Write(msg.Data, 0, msg.Data.Length);//向文件中写入接收物信息 } finally { fs.Close();//关闭文件 } break; } case SendState.Sending: { FileStream fs = null; 毕业设计(论文)报告用纸 第 38 页 共 42 页 try { string FileName = "c:\\Void.jpg"; //设置文件接收路径 fs = File.OpenWrite(FileName); //打开当前要写入的文件 fs.Seek(0, SeekOrigin.End); //将该流的当前位值设为 fs.Write(msg.Data, 0, msg.Data.Length);//向文件中写入当前接收的信息 } finally { fs.Close(); } break; } case SendState.End: { pictureBox8.Load("c:\\Void.jpg"); break; } } } break; } } #endregion #region 拍照 private void buttonX1_Click_1(object sender, EventArgs e) { string PhotoName = "C:\\Photo" + PhotoNum + ".bmp"; viodeo.GrabImage(pictureBox1.Handle, PhotoName); PhotoNum++; Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.SelectionStart = 0;//将文本的起始点设为 毕业设计(论文)报告用纸 第 39 页 共 42 页 Rich_Out.AppendText(Publec_Class.UserName); //将当前用户名添加到文本框中 Rich_Out.AppendText(" " + DateTime.Now.ToString()); //将当前发送的时间添加到文本框中 Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.AppendText(" 拍照成功,照片已保存于" + PhotoName); } #endregion #region 录像 private void btnGetVideo_Click(object sender, EventArgs e) { Thread GetVideo = new Thread(new ThreadStart(viodeo.StartKinescope)); if (btnGetVideo.Text == "录 像") { btnGetVideo.Text = "停止录像"; Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.SelectionStart = 0;//将文本的起始点设为 Rich_Out.AppendText(Publec_Class.UserName); //将当前用户名添加到文本框中 Rich_Out.AppendText(" " + DateTime.Now.ToString()); //将当前发送的时间添加到文本框中 Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.AppendText(" 录像已开始,视频已保存于C:\\CAPTURE"); GetVideo.Start(); } else { btnGetVideo.Text = "录 像"; Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.SelectionStart = 0;//将文本的起始点设为 Rich_Out.AppendText(Publec_Class.UserName); //将当前用户名添加到文本框中 Rich_Out.AppendText(" " + DateTime.Now.ToString()); //将当前发送的时间添加到文本框中 Rich_Out.AppendText("\r\n");//换行回车 毕业设计(论文)报告用纸 第 40 页 共 42 页 Rich_Out.AppendText(" 录像已完成,视频已保存于C:\\CAPTURE"); GetVideo.Abort(); viodeo.StopKinescope(); } } #endregion #region 发送文本消息 private void btnSendMessange_Click(object sender, EventArgs e) { PAddress ip = IPAddress.Parse(Publec_Class.ServerIP); I //服务器端的IP地址 string port = Publec_Class.ServerPort;//端口号 string revid = ((this.Tag as TreeNode).Tag as ClassUserInfo).UserID; //接收ID号 string sid = Publec_Class.UserID;//发送ID string msgid = Guid.NewGuid().ToString();//设置全局惟一标识 byte[] data = Encoding.Unicode.GetBytes(rich_Input.Rtf); //将当前要发送的信息转换成二进制流 ClassMsg msg = new ClassMsg(); msg.sendKind = SendKind.SendMsg;//发送的消息 msg.msgCommand = MsgCommand.SendToOne;//发送的是单用户信息 msg.SID = sid;//发送ID msg.RID = revid;//接收ID msg.Data = data;//发送的信息 msg.msgID = msgid; if (data.Length <= 1024)//如果发送信息的长度小于等于 { msg.sendState = SendState.Single; //将信息直接发送给远程客户端 udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(msg).ToArray()); } else { ClassMsg start = new ClassMsg(); 毕业设计(论文)报告用纸 第 41 页 共 42 页 start.sendKind = SendKind.SendMsg; start.sendState = SendState.Start;//文件发送开始命令 start.msgCommand = MsgCommand.SendToOne;//发送单用户命令 start.SID = sid; start.RID = revid; start.Data = Encoding.Unicode.GetBytes(""); start.msgID = msgid; udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(start).ToArray()); MemoryStream stream = new MemoryStream(data); //将二进制流存储到内存流中 int sendlen = 1024; //设置文件每块发送的长度 long sunlen = (stream.Length);//整个文件的大小 int offset = 0;//设置文件发送的起始位置 while (sunlen > 0) //分流发送 { sendlen = 1024; if (sunlen <= sendlen) sendlen = Convert.ToInt32(sunlen); byte[] msgdata = new byte[sendlen]; stream.Read(msgdata, offset, sendlen);//读取要发送的字节块 msg.sendState = SendState.Sending;//发送状态为文件发送中 msg.Data = msgdata; udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(msg).ToArray()); //发送当前块的信息 sunlen = sunlen - sendlen;//记录下一块的起始位置 } ClassMsg end = new ClassMsg(); end.sendKind = SendKind.SendMsg; end.sendState = SendState.End;//文件发送结束命令 end.msgCommand = MsgCommand.SendToOne; end.SID = sid; end.RID = revid; end.Data = Encoding.Unicode.GetBytes(""); 毕业设计(论文)报告用纸 第 42 页 共 42 页 end.msgID = msgid; udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(end).ToArray()); //发送信息,通知文件发送结束 // string dir = System.Environment.CurrentDirectory; // dir = dir.Substring(0, dir.Length - 9); // pictureBox1.Load(dir + @"Image\QQ12.jpg"); } Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.SelectionStart = 0;//将文本的起始点设为 Rich_Out.AppendText(Publec_Class.UserName); //将当前用户名添加到文本框中 Rich_Out.AppendText(" " + DateTime.Now.ToString()); //将当前发送的时间添加到文本框中 Rich_Out.AppendText("\r\n");//换行回车 Rich_Out.SelectedRtf = rich_Input.Rtf; //将发送信息添加到接收文本框中 Rich_Out.Focus(); Rich_Out.ScrollToCaret(); // 使文本输出框的滚动条在最下方 Rich_Out.Focus(); rich_Input.Clear();//清空发送文本框 } #endregion 毕业设计(论文)报告用纸 第 43 页 共 42 页 毕业设计(论文)报告用纸 第 44 页 共 42 页 毕业设计(论文)报告用纸 第 45 页 共 42 页
本文档为【UDP局域网QQ聊天程序设计说明书】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_654168
暂无简介~
格式:doc
大小:271KB
软件:Word
页数:70
分类:
上传时间:2017-10-06
浏览量:24