资源描述:
《毕业设计(论文)-基于c#的网络聊天软件的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
四川职业技术学院计科系论文摘要作为除电视、报纸、广播之外的第四大媒体,互联网不仅成为人们获取新闻信息的主要来源,更成为了人们闲暇之余的一种休闲手段。随着互联网技术的发展,各种各样基于网络的应用也随之诞生,网络聊天工具便是其中的一种。本文采用VisualStudio2015+MyMysql开发环境,结合WinForms、ADO.NET等多种技术,实现了一个类似QQ的网络聊天工具,并在WINDOWS平台上加以了实现。通过C#语言进行网络编程,通过公共的数据库交换各种信息,实现了人性化的界面设计与功能设计。软件经过测试,满足现代人们即时通信的需求,达到预期的设计效果,对网络聊天工具的人性化设计具有一定的现实意义,同时也为其他相关项目的设计提供了参考。关键词:网络聊天工具C#即时通信数据库人性化41 四川职业技术学院计科系论文目录摘要I第一章引言12.3WinForms窗体设计技术52.4C/S结构52.5ADO.NET技术62.6MyMysql数据库简介6第三章需求分析83.1可行性研究83.2用户需求83.3性能需求83.4系统功能需求9第四章系统设计104.1系统功能结构104.2系统模块划分104.3系统整体流程图11第五章详细设计125.1登录界面设计125.2注册界面设计165.3主界面设计205.4查找/添加好友界面设计245.5聊天界面设计295.6个人设置界面设计345.7头像选择界面设计365.8系统消息界面设计37结束语40参考文献41附录一42附录二4341 四川职业技术学院计科系论文第一章引言1.1系统开发背景当今社会已进入信息时代,信息是当今世界最重要的资源之一,它与物质及能源一起构成了三大能源支柱。信息高速公路是信息社会的基础设施,而互联网则是信息高速公路的重要组成部分。在互联网相当普及的今天,你们对网络的依赖越来越大,越来越离不开网络,网络聊天更是成为了人们的“家常便饭”。通过网络聊天工具,人们足不出户就可进行闲聊甚至工作会谈,极大地方便了人们的日常生活与工作需求。常用的网络聊天工具主要是QQ与MSN。MSN主要用于国际,而国内的主流网络聊天工具是QQ。QQ有着非常良好的操作界面,和强大的通信功能,集娱乐、生活和工作于一身。随着技术的进步,QQ不仅可以通过宽带网在PC上使用,通过手机也可以实现与好友、同事通信。而无论是QQ还是MSN,都存在一个很大的问题——广告。每次登陆后时不时会弹出一些广告窗口,绝大多数网友都对此感觉厌烦。因此在本次论文的激励下,我决定设计一个类似QQ并且无垃圾信息的网络聊天工具,此外也希望通过本次论文能更好地学习与掌握网络软件编程知识。1.2聊天软件的开发目标本论文的主要工作是设计一个类似QQ的网络即时聊天工具,主要是采用WinForms+ADO.NET技术实现。软件功能主要包括用户注册、用户登录、用户间聊天、查找/添加好友、个人设置等。客户端通过公共的数据库交换信息,消息的发送和读取都是通过操作数据库来完成的。在程序中采用定时扫描数据库的方式来查找未读消息。文章首先简介涉及的相关技术与基本知识,然后阐述本软件的功能,再具体分析软件各个模块的功能及具体实现方法。41 四川职业技术学院计科系论文第二章开发环境与关键技术简介2.1C#简介C#(读作CSharp)是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言,是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。C#最引人入胜的地方是它和Java的不同,而不是相似的地方:中间代码 微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地。微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码。它也明白许多,如果不是大多数的话,程序员认为Java程序要不可避免的比C编写的任何东西都要慢。而这种实现方式决定了基于MSIL的程序(指的是用C#,VisualBasic,"ManagedC++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码。当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布。但是JavaJIT编译器的普遍存在使得Java和C#在性能上相对相同。象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧。Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码。命名空间中的申明 当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类。同在这个命名空间里(在类的外面)你还有可能声明接口,枚举类型和结构体。必须使用using关键字来引用其他命名空间的内容。基本的数据类型41 四川职业技术学院计科系论文 C#拥有比C,C++或者Java更广泛的数据类型。这些类型是bool,byte,ubyte,short,ushort,int,uint,long,ulong,float,double,和decimal。象Java一样,所有这些类型都有一个固定的大小。又象C和C++一样,每个数据类型都有有符号和无符号两种类型。与Java相同的是,一个字符变量包含的是一个16位的Unicode字符。C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字。两个基本类 一个名叫object的类是所有其他类的基类。而一个名叫string的类也象object一样是这个语言的一部分。作为语言的一部分存在意味着编译器有可能使用它,无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它。参数传递 方法可以被声明接受可变数目的参数。缺省的参数传递方法是对基本数据类型进行值传递。ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值。out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值。与COM的集成C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术。实际上,最终有可能在任何.NET语言里编写COM客户和服务器端。C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件。这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化。代理和反馈 一个代理对象包括了访问一个特定对象的特定方法所需的信息。只要把它当成一个聪明的方法指针就行了。代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用。一个反馈方法是代理的特例。event关键字用在将在事件发生的时候被当成代理调用的方法声明。41 四川职业技术学院计科系论文2.2.NETFramework简介.NETFramework是支持生成、运行下一代应用程序和XMLWebServices的内部Windows组件,它简化了在高度分布式Internet环境中的应用程序开发,.NETFramework可实现的功能如下:l提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在Internet上分布,或者是在远程执行的。l提供一个将软件部署和版本控制冲突最小化的代码执行环境。l提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。l提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。l使开发人员的经验在面对类型大不相同的应用程序(如基于Windows的应用程序和基于Web的应用程序)时保持一致。l按照工业标准生成所有通信,以确保基于.NETFramework的代码可与任何其他代码集成。.NETFramework具有两个主要组件:公共语言运行库和.NETFramework类库。 公共语言运行库是.NETFramework的基础。您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。这类似于Java的虚拟机。事实上,代码管理的概念是公共语言运行库的基本原则。以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。 .NETFramework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序(如Web窗体和XMLWebservices)。.NETFramework可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NETFramework不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。41 四川职业技术学院计科系论文2.3WinForms窗体设计技术WinForm是.Net开发平台中对WindowsForm的一种称谓。.Net为开发WinForm的应用程序提供了丰富的ClassLibrary(类库)。这些WinFrom类库支持RAD(快速应用程序开发),这些类库被封装在一个名称空间之中,这个名称空间就是System.Windows.Forms。在此名称空间中定义了许多类,在开发基于.Net的GUI应用程序的时候,就是通过继承和扩展这些类才使得我们的程序有着多样的用户界面。2.4C/S结构C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答,如图2-1所示。41 四川职业技术学院计科系论文图2-1客户机/服务器通信结构示图2.5ADO.NET技术ADO.NET是一组用于和数据源进行交互的面向对象类库。通常情况下,数据源是数据库,但它同样也能够是文本文件、Excel表格或者XML文件。ADO.NET允许和不同类型的数据源以及数据库进行交互。然而并没有与此相关的一系列类来完成这样的工作。因为不同的数据源采用不同的协议,所以对于不同的数据源必须采用相应的协议。一些老式的数据源使用ODBC协议,许多新的数据源使用OleDb协议,并且现在还不断出现更多的数据源,这些数据源都可以通过.NET的ADO.NET类库来进行连接。ADO.NET提供与数据源进行交互的相关的公共方法,但是对于不同的数据源采用一组不同的类库。这些类库称为DataProviders,并且通常是以与之交互的协议和数据源的类型来命名的。然而无论使用什么样的DataProvider,你将使用相似的对象与数据源进行交互。MysqlConnection对象管理与数据源的连接。MysqlCommand对象允许你与数据源交流并发送命令给它。为了对进行快速的只“向前”地读取数据,使用MysqlDataReader。如果想使用断开数据,使用DataSet并实现能进行读取或者写入数据源的MysqlDataAdapter。2.6MyMysql数据库简介MyMysql是一个关系型数据库管理系统,由瑞典MyMysqlAB公司开发,目前属于 Oracle 旗下产品。MyMysql是最流行的关系型数据库管理系统之一,在WEB41 四川职业技术学院计科系论文应用方面,MyMysql是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。MyMysql所使用的Mysql语言是用于访问数据库的最常用标准化语言。MyMysql软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MyMysql作为网站数据库。与其他的大型数据库,例如 Oracle、DB2、MysqlServer等相比,MyMysql自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MyMysql提供的功能已经绰绰有余,而且由于MyMysql是开放源码软件,因此可以大大降低总体拥有成本MyMysql可应用于多种语言,包括PERL,C,C++,JAVA和PHP。在这些语言中,MyMysql在PHP的web开发中是应用最广泛。MyMysql是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。本网络聊天软件的开发环境主要使用MyMysql。EditionnavicatformyMysql(32位和64位)NavicatforMyMysql是一套管理和开发MyMysql或MariaDB的理想解决方案,支持单一程序,可同时连接到MyMysql和MariaDB。这个功能齐备的前端软件为数据库管理、开发和维护提供了直观而强大的图形界面,给MyMysql或MariaDB新手以及专业人士提供了一组全面的工具。NavicatforMyMysql是一款强大的MyMysql数据库管理和开发工具,它为专业开发者提供了一套强大的足够尖端的工具,但对于新用户仍然易于学习。NavicatforMyMysql基于Windows平台,为MyMysql量身订作,提供类似于MyMysql的管理界面工具。此解决方案的出现,将解放PHP、J2EE等程序员以及数据库设计者、管理者的大脑,降低开发成本,为用户带来更高的开发效率。NavicatforMyMysql使用了极好的图形用户界面(GUI),可以用一种安全和更为容易的方式快速和容易地创建、组织、存取和共享信息。用户可完全控制MyMysql数据库和显示不同的管理资料,包括一个多功能的图形化管理用户和访问权限的管理工具,方便将数据从一个数据库转移到另一个数据库中(LocaltoRemote、RemotetoRemote、RemotetoLocal),进行档案备份。NavicatforMyMysql支持Unicode,以及本地或远程MyMysql服务器多连线,用户可浏览数据库、建立和删除数据库、编辑数据、建立或执行Mysqlqueries、管理用户权限(安全设定)、将数据库备份/复原、汇入/汇出数据(支援CSV,TXT,DBF和XML档案种类)等。软件与任何MyMysql5.0.x伺服器版本兼容,支援Triggers,以及BINARYVARBINARY/BIT数据种类等的规范。41 四川职业技术学院计科系论文第三章需求分析3.1可行性研究本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。开发所需要的平台已经搭建好,并做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与C#开发环境的严密契合能力,加之相类似的更大规模的网络聊天工具产品也已有例在先,所以这个程序的开发在技术上是完全可行的。3.2用户需求随着互联网的普及,网络聊天工具已经成为了人们日常生活中不可缺少的一部分。根据人们对聊天工具的需求,主要可以概括为以下几点:1、操作简单方便、界面简洁美观;2、能够注册新用户;3、拥有熟悉的聊天界面;4、能够查找/添加好友;5、能够进行个人设置;6、系统运行稳定、安全可靠。3.3性能需求首先要求程序要完全可靠,可以应付各种由于系统问题产生的错误,比如初始网络失败等。要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。41 四川职业技术学院计科系论文开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能够清晰的理解整个系统的设计思路以及实现细节。要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。并且不发生内存泄漏之类影响系统运行的错误事件。并且要求易于维护及扩展。所以应该采用模块化开发,各个模块之间不要有太多的耦合,以免维护困难。3.4系统功能需求这个程序要实现的功能如下:1)程序启动之后就能直接进入登陆界面,输入错误时会提示。2)程序启动之后,检测是否有网络连接,有则登录,无则提示没有网络。3)登陆界面有注册新用户选项,点击进入注册界面。4)注册成功后会提示自动生成的QQ号码。5)登陆后进入主界面,用户可以添加好友,可以直接查找,也可以按条件查找,还可以查看所有用户。6)当双击列表中某个用户头像的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。7)聊天界面要人性化,下面是发送框,上面对方发来的上一条聊天记录。8)可以修改自己的个人资料,也可以更换头像。41 四川职业技术学院计科系论文第四章系统设计4.1系统功能结构基于C#的网络聊天软件更换头像个人设置用户登录好友列表发送消息删除好友添加好友接收消息查找好友用户注册图4-1系统功能结构4.2系统模块划分登录模块:实现用户登录功能。在没有账号的情况下可以选择进入注册新用户界面。注册模块:实现注册新用户功能。注册信息包括必填基本资料与选填资料。主模块:实现列表功能。列表包括好友列表与陌生人列表。通过主界面可以进行聊天功能,也可以打开查找/添加好友功能与个人设置功能等。聊天模块:实现发送消息与接收消息功能。通过公共的数据库交换信息,消息的发送和读取都是通过操作数据库来完成的。在程序中采用定时扫描数据库的方式来查找未读消息。也能实现删除好友功能。查找/添加好友模块:实现查找好友功能与添加好友功能。主要方法有精确查找、按条件查找,与查看所有用户。个人设置模块:实现修改个人资料。更换头像模块:实现更换用户头像。系统消息模块:实现添加好友信息的读取。41 四川职业技术学院计科系论文4.3系统整体流程图该网络聊天工具系统整体流程图如图4-2所示:登录成功主界面聊天界面/个人设置界面/查找添加好友界面NYYNNY显示号码注册成功合法?输入检查注册登录验证输入登录数据已注册?用户图4-2系统整体流程图41 四川职业技术学院计科系论文第五章详细设计5.1登录界面设计当用户运行程序时,首先进入的是登录界面,如图5-1所示:图5-1登录界面如果没有账号,则单击“注册新用户”标签,可以打开注册界面;如果有已注册的账号,则在输入账号与密码后,点击“登录”按钮,可以打开主界面。如果输入有误,则出现图5-2所示界面:图5-2输入错误程序也不允许在账号或密码处输入空格字符,如有此情况,则会出现图5-3与图5-4所示界面:41 四川职业技术学院计科系论文图5-3未输入账号图5-4未输入密码当点击“登录”按钮时,则触发登录按钮事件,其处理流程图如图5-5所示:用户输入登录数据扫描数据库中的Users表有该用户且密码正确?登录成功主界面YN41 四川职业技术学院计科系论文图5-5登录事件流程图其中登录按钮的代码实现如下://登录按钮事件处理privatevoidbtnLogin_Click(objectsender,EventArgse){boolerror=false;//标志在执行数据库操作的过程中是否出错//如果输入验证成功,就验证身份,并转到相应的窗体if(ValidateInput()){intnum=0;//数据库操作结果try{//查询用的Mysql语句stringMysql=string.Format("SELECTCOUNT(*)FROMUsersWHEREId={0}ANDLoginPwd='{1}'",int.Parse(txtLoginId.Text.Trim()),txtLoginPwd.Text.Trim());//创建Command对象MysqlCommandcommand=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();//打开数据库连接num=Convert.ToInt32(command.ExecuteScalar());}catch(Exceptionex){error=true;Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();//关闭数据库连接}if(!error&&(num==1))//验证通过{//设置登录的用户号码UserHelper.loginId=int.Parse(txtLoginId.Text.Trim());//创建主窗体MainFormmainForm=newMainForm();mainForm.Show();//显示窗体41 四川职业技术学院计科系论文this.Visible=false;//当前窗体不可见}else{MessageBox.Show("输入的用户名或密码有误!","登录提示",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}//用户输入验证privateboolValidateInput(){//验证用户输入if(txtLoginId.Text.Trim()==""){MessageBox.Show("请输入登录的号码","登录提示",MessageBoxButtons.OK,MessageBoxIcon.Information);txtLoginId.Focus();returnfalse;}elseif(txtLoginPwd.Text.Trim()==""){MessageBox.Show("请输入密码","登录提示",MessageBoxButtons.OK,MessageBoxIcon.Information);txtLoginPwd.Focus();returnfalse;}returntrue;}41 四川职业技术学院计科系论文5.2注册界面设计当在登录界面点击“注册新用户”标签时,将打开注册界面,如图5-6所示:图5-6注册界面41 四川职业技术学院计科系论文其中基本资料为必填资料,详细资料为选填资料。在用户输入完资料后,点击“确认注册”按钮进行注册。其间会对相关的输入进行检查,如果输入不符合规范,则不允许注册,不会向数据库插入记录,并会提示错误原因。如果输入正确,则向数据库插入一条用户记录,在数据库中自动生成一个新的登录号码(Users表的Id字段),以消息框的形式告诉用户申请成功的号码。其流程图如图5-7所示:NY用户返回登录界面注册成功并显示号码向数据库中添加记录合法?提示不合法原因检查合法性输入注册信息自动添加星座选项与血型选项打开注册界面图5-7注册界面流程图41 四川职业技术学院计科系论文其中确认注册按钮的代码实现如下://点击注册,向数据库添加记录privatevoidbtnRegist_Click(objectsender,EventArgse){//输入验证通过,就插入记录到数据库if(ValidateInput()){intmyQQNum=0;//QQ号码stringmessage;//弹出的消息stringsex=rdoMale.Checked?rdoMale.Text:rdoFemale.Text;//获得选中的性别stringMysql="";//查询用的Mysql语句intstarId;//星座IdintbloodTypeId;//血型Idboolerror=false;//操作数据库是否出错//根据星座和血型的选择来分情况确定Mysql语句if(cboStar.Text!=""&&cboBloodType.Text!=""){//获得星座的IdstarId=GetStarId();//获得血型的IdbloodTypeId=GetBloodType();Mysql=string.Format("INSERTINTOUsers(LoginPwd,NickName,Sex,Age,Name,StarId,BloodTypeId)values('{0}','{1}','{2}',{3},'{4}',{5},{6})",txtLoginPwd.Text.Trim(),txtNickName.Text.Trim(),sex,int.Parse(txtAge.Text.Trim()),txtName.Text.Trim(),starId,bloodTypeId);}elseif(cboStar.Text!=""&&cboBloodType.Text==""){//获得星座的IdstarId=GetStarId();Mysql=string.Format("INSERTINTOUsers(LoginPwd,NickName,Sex,Age,Name,StarId)values('{0}','{1}','{2}',{3},'{4}',{5})",txtLoginPwd.Text.Trim(),txtNickName.Text.Trim(),sex,int.Parse(txtAge.Text.Trim()),txtName.Text.Trim(),starId);}elseif(cboStar.Text==""&&cboBloodType.Text!=""){//获得血型的IdbloodTypeId=GetBloodType();Mysql=string.Format("INSERTINTOUsers(LoginPwd,NickName,Sex,Age,Name,BloodTypeId)values('{0}','{1}','{2}',{3},'{4}',{5})",txtLoginPwd.Text.Trim(),txtNickName.Text.Trim(),sex,41 四川职业技术学院计科系论文int.Parse(txtAge.Text.Trim()),txtName.Text.Trim(),bloodTypeId);}else{Mysql=string.Format("INSERTINTOUsers(LoginPwd,NickName,Sex,Age,Name)values('{0}','{1}','{2}',{3},'{4}')",txtLoginPwd.Text.Trim(),txtNickName.Text.Trim(),sex,int.Parse(txtAge.Text.Trim()),txtName.Text.Trim());}try{//创建Command对象MysqlCommandcommand=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();//打开数据库连接intresult=command.ExecuteNonQuery();//执行插入命令if(result==1){Mysql="SELECT@@IdentityFROMUsers";//查询新增加的记录的标识号command.CommandText=Mysql;//重新指定Command对象的Mysql语句myQQNum=Convert.ToInt32(command.ExecuteScalar());//强制类型转换会出错message=string.Format("注册成功!你的MyQQ号码是{0}",myQQNum);}else{message="注册失败,请重试!";}}catch(Exceptionex){error=true;message="服务器出现意外错误!请稍候再试!";Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();//关闭数据库连接}//显示注册结果41 四川职业技术学院计科系论文if(error){MessageBox.Show(message,"注册失败",MessageBoxButtons.OK,MessageBoxIcon.Warning);}else{MessageBox.Show(message,"注册结果",MessageBoxButtons.OK,MessageBoxIcon.Information);}this.Close();}}5.3主界面设计当用户输入正确的登录信息并登录后,出现图5-8所示的主界面:图5-8主界面41 四川职业技术学院计科系论文登陆后在“我的好友”列表中显示当前好友列表,包括好友的头像和昵称。在主界面的顶部要显示当前登陆的用户头像,昵称和登录账号。当有新的聊天消息时候。发来的消息的好友头像要闪动,双击头像弹出“聊天”窗口后,头像停止闪动,当有添加好友请求消息时,窗体底部的好友请求验证按钮要闪烁,单击该按钮弹出“系统消息”窗体后,按钮停止闪烁。通过主窗体下方的按纽打开“查找/添加好友”窗体,“个人信息”窗口,“系统消息”窗口,也可刷新好友列表和退出程序。通过右键菜单能够切换大小头像。能够把陌生人转为好友,能够删除一个好友或陌生人,如图5-9所示:图5-9右键功能显示好友列表的控键可以用提供的第三方控键sidebar,该控键的命名空间为Aptech.ui。Sidebar是一个能够以分组形式显示列表的控件,能够实现类似QQ的好友分组功能,sidebar控键中可以包含很多组(sbgroup),每个组可以包含很多sidebar项(sbitem)。Sidebar的列表项有两种显示方式:大图标和小图标,它可以通过它的view属性来设置。Sidebar控件还有一个imagelist属性,可以和一个imagelist控件关联,列表项中显示的图片就是存放在imagelist控件中的图片。可以通过Sidebar项(sbitem)的imageindex来指定图片在imagelist控件中的索引。其中加载窗体时的代码如下://窗体加载时发生privatevoidMainForm_Load(objectsender,EventArgse)41 四川职业技术学院计科系论文{//工具栏的消息图标tsbtnMessageReading.Image=ilMessage.Images[0];//显示个人的信息ShowSelfInfo();//添加SideBar的两个组sbFriends.AddGroup("我的好友");sbFriends.AddGroup("陌生人");//向我的好友组中添加我的好友列表ShowFriendList();}定时扫描数据库读取未读信息的代码如下://定时扫描数据库,找到未读消息privatevoidtmrMessage_Tick(objectsender,EventArgse){ShowFriendList();//刷新好友列表intmessageTypeId=1;//消息类型intmessageState=1;//消息状态//找出未读消息对应的好友IdstringMysql=string.Format("SELECTTop1FromUserId,MessageTypeId,MessageStateFROMMessagesWHEREToUserId={0}ANDMessageState=0",UserHelper.loginId);MysqlCommandcommand;//消息有两种类型:聊天消息、添加好友消息try{command=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();MysqlDataReaderdataReader=command.ExecuteReader();//循环读出一个未读消息if(dataReader.Read()){this.fromUserId=(int)dataReader["FromUserId"];messageTypeId=(int)dataReader["MessageTypeId"];messageState=(int)dataReader["MessageState"];}dataReader.Close();}catch(Exceptionex){41 四川职业技术学院计科系论文Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}//判断消息类型,如果是添加好友消息,就启动喇叭timer,让小喇叭闪烁if(messageTypeId==2&&messageState==0){SoundPlayerplayer=newSoundPlayer("system.wav");player.Play();tmrAddFriend.Start();}//如果是聊天消息,就启动聊天timer,让好友头像闪烁elseif(messageTypeId==1&&messageState==0){//获得发消息的人的头像IdMysql="SELECTFaceIdFROMUsersWHEREId="+this.fromUserId;try{command=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();this.friendFaceId=Convert.ToInt32(command.ExecuteScalar());//设置发消息的好友的头像索引}catch(Exceptionex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}//如果发消息的人没有在列表中就添加到陌生人列表中if(!HasShowUser(fromUserId)){UpdateStranger(fromUserId);}SoundPlayerplayer=newSoundPlayer("msg.wav");player.Play();tmrChatRequest.Start();//启动闪烁头像定时器}41 四川职业技术学院计科系论文}5.4查找/添加好友界面设计在主界面中单击”查询”按钮后,出现查找/添加好友界面如图5-10所示:图5-10查找/添加好友界面直接点击“查找”后,即查找所有用户,查询结果如图5-11所示:图5-11基本查找单击“上一步”则回到“基本查找”页面。点击“精确查找”,如图5-12所示:41 四川职业技术学院计科系论文图5-12精确查找输入帐号或昵称,点击“查找”可以显示查询结果。“高级查找”界面如图5-13所示:图5-13高级查找操作方法同基本查找类似。单击“查找”按纽后在窗体中显示查询结果。要求以DataGridView控件显示查找的结果。选中一个用户,单击“加为好友”按纽,进行添加好友的操作,并根据不同的情况弹出消息对话框,告知用户如“添加好友请求成功”,“对方不让任何人添加他为好友“,“对方需要身份验证,已发出验证请求”等。如果需要身份验证,不要求输入验证消息内容,直接发送验证消息即可。添加好友的流程图如图5-14所示:41 四川职业技术学院计科系论文发出好友请求消息对方不允许被添加为好友不能重复添加好友不能添加自己为好友没有选择任何好友YYYYYNNNNN结束添加好友friendshipPolicyId=2?friendshipPolicyId=3?获得对方的好友验证friendshipPolicyId对方已经为好友?friendId=自身Id?friendId=-1?获得选中好友的号码friendId图5-14添加好友流程图其中基本查找和高级查找两部分的代码如下:///基本查找privatevoidBasicallySearch(){41 四川职业技术学院计科系论文stringMysql="";//查询语句的前半部分Mysql="SELECTId,NickName,Age,SexFROMUsers";//精确查找if(rdoNicetySearch.Checked==true){if(txtLoginId.Text.Trim()==""&&txtNickName.Text.Trim()==""){MessageBox.Show("还没有填查询条件呢!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}//按帐号查找elseif(txtLoginId.Text.Trim()!=""){Mysql+=string.Format("WHEREId={0}",int.Parse(txtLoginId.Text.Trim()));}//按昵称查找else{Mysql+=string.Format("WHERENickNamelike'%{0}%'",txtNickName.Text.Trim());}}//重新填充DataSetdataSet.Tables[0].Clear();dataAdapter.SelectCommand.CommandText=Mysql;dataAdapter.Fill(dataSet,"Users");//设置控件可见的属性//调整显示结果的panel的位置,让它和显示条件的Panel的位置相同pnlBaseResult.Location=pnlBaseCondition.Location;//使显示结果的panel可见pnlBaseResult.Visible=true;btnAdd.Visible=true; //“加为好友”按钮可见btnBack.Visible=true;//“上一步”按钮可见}///高级查找privatevoidAdvancedSearch(){stringMysql="";//查询语句的前半部分Mysql="SELECTId,NickName,Age,SexFROMUsers";41 四川职业技术学院计科系论文stringageCondition="";//年龄条件stringsexCondition=cboSex.Text;//性别条件//确定年龄的范围switch(cboAge.SelectedIndex){case1:ageCondition="Age>=0ANDAge<10";break;case2:ageCondition="Age>=10ANDAge<20";break;case3:ageCondition="Age>=20ANDAge<30";break;case4:ageCondition="Age>=30ANDAge<40";break;case5:ageCondition="Age>=40ANDAge<50";break;case6:ageCondition="Age>=50";break;default:ageCondition="";break;}if(ageCondition==""&&sexCondition==""){MessageBox.Show("还没有选择查询条件呢!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}else{if(ageCondition!=""&&sexCondition==""){Mysql+=string.Format("WHERE{0}",ageCondition);}elseif(ageCondition==""&&sexCondition!=""){Mysql+=string.Format("WHERESex='{0}'",sexCondition);}else41 四川职业技术学院计科系论文{Mysql+=string.Format("WHERE{0}ANDSex='{1}'",ageCondition,sexCondition);}}//开始查找dataAdapter.SelectCommand.CommandText=Mysql;dataSet.Tables[0].Clear();dataAdapter.Fill(dataSet,"Users");//设置控件的属性pnlAdvancedResult.Location=pnlAdvancedCondition.Location;pnlAdvancedResult.Visible=true;btnAdd.Visible=true;btnBack.Visible=true;}5.5聊天界面设计当有消息时,主窗体中好友头像闪烁,双击头像,弹出“聊天”窗口,如图5-15所示:图5-15聊天界面41 四川职业技术学院计科系论文NNYY将信息写入数据库信息过长?发送空消息?用户输入发送信息发送信息的流程图如图5-16所示:图5-16发送信息流程图发送消息部分的关键代码如下://发送消息privatevoidbtnSend_Click(objectsender,EventArgse){if(txtChat.Text.Trim()=="")//不能发送空消息{MessageBox.Show("不能发送空消息!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}elseif(txtChat.Text.Trim().Length>50){MessageBox.Show("消息内容过长,请分为几条发送!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}else//发送消息,写入数据库{//MessageTypeId:1-表示聊天消息,为简化操作没有读取数据表,到S2可以用常量或者枚举实现//MessageState:0-表示消息状态是未读intresult=-1;//表示操作数据库的结果stringMysql=string.Format("INSERTINTOMessages(FromUserId,ToUserId,Message,41 四川职业技术学院计科系论文MessageTypeId,MessageState)VALUES({0},{1},'{2}',{3},{4})",UserHelper.loginId,friendId,txtChat.Text.Trim(),1,0);try{//执行命令MysqlCommandcommand=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();result=command.ExecuteNonQuery();}catch(Exceptionex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}if(result!=1){MessageBox.Show("服务器出现意外错误!","抱歉",MessageBoxButtons.OK,MessageBoxIcon.Error);}txtChat.Text="";//输入消息清空this.Close();}}读取信息的流程图如图5-17所示:定时扫描数据库N有未读信息?YN未读信息为聊天信息?Y读出信息显示在窗体中41 四川职业技术学院计科系论文将显出的信息置为已读图5-17读取信息流程图读取消息部分的关键代码如下://////读取所有的未读消息,显示在窗体中///privatevoidShowMessage(){stringmessageIdsString="";//消息的Id组成的字符串stringmessage;//消息内容stringmessageTime;//消息发出的时间//读取消息的Mysql语句stringMysql=string.Format("SELECTId,Message,MessageTimeFromMessagesWHEREFromUserId={0}ANDToUserId={1}ANDMessageTypeId=1ANDMessageState=0",friendId,UserHelper.loginId);try{MysqlCommandcommand=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();MysqlDataReaderreader=command.ExecuteReader();//循环将消息添加到窗体上while(reader.Read()){messageIdsString+=Convert.ToString(reader["Id"])+"_";message=Convert.ToString(reader["Message"]);messageTime=Convert.ToDateTime(reader["MessageTime"]).ToString();//转换为日期类型lblMessages.Text+=string.Format(" {0}{1} {2}",nickName,messageTime,message);}reader.Close();}catch(Exceptionex){Console.WriteLine(ex.Message);}finally41 四川职业技术学院计科系论文{DBHelper.connection.Close();}//把显示出的消息置为已读if(messageIdsString.Length>1){messageIdsString.Remove(messageIdsString.Length-1);SetMessageRead(messageIdsString,'_');}}//////把显示出的消息置为已读///privatevoidSetMessageRead(stringmessageIdsString,charseparator){string[]messageIds=messageIdsString.Split(separator);//分割出每个消息IdstringMysql="UpdateMessagesSETMessageState=1WHEREId=";//更新状态的Mysql语句的固定部分stringupdateMysql;//执行的Mysql语句try{MysqlCommandcommand=newMysqlCommand();//创建Command对象command.Connection=DBHelper.connection;//指定数据库连接DBHelper.connection.Open();//打开数据库连接foreach(stringidinmessageIds){if(id!=""){updateMysql=Mysql+id;//补充完整的Mysql语句command.CommandText=updateMysql;//指定要执行的Mysql语句intresult=command.ExecuteNonQuery();//执行命令}}}catch(Exceptionex){Console.WriteLine(ex.Message);}finally{41 四川职业技术学院计科系论文DBHelper.connection.Close();}}5.6个人设置界面设计在主界面单击标题栏的头像,或单击工具栏“设”字样按钮,则弹出“个人信息设置”界面,如图5-18所示:图5-18个人资料在“个人信息”窗口能够修改个人的基本资料,也能进行安全设置。安全设置选项界面如图5-19所示:图5-19安全设置41 四川职业技术学院计科系论文在“安全设置”选项窗口中能进行密码修改与身份验证设置。关键代码如下://////获得更新数据库的Mysql语句///privatestringGetMysql(){//更新用的Mysql语句,分成段拼凑stringMysql=string.Format("UPDATEUsersSETNickName='{0}',FaceId={1},Sex='{2}',Age={3}",txtNickName.Text.Trim(),Convert.ToInt32(picFace.Tag),cboSex.Text.Trim(),Convert.ToInt32(txtAge.Text.Trim()));if(txtNewPwd.Text.Trim()!="")//如果修改了密码就更新密码字段{Mysql=string.Format("{0},LoginPwd='{1}'",Mysql,txtNewPwd.Text.Trim());}//添加好友策略,判断哪个但选按钮被选中intfriendshipPolicyId=0;if(rdoAnybody.Checked){friendshipPolicyId=Convert.ToInt32(rdoAnybody.Tag);}elseif(rdoValidation.Checked){friendshipPolicyId=Convert.ToInt32(rdoValidation.Tag);}elseif(rdoNobody.Checked){friendshipPolicyId=Convert.ToInt32(rdoNobody.Tag);}//完整的MysqlMysql=string.Format("{0},FriendshipPolicyId={1},Name='{2}',starId={3},BloodTypeId={4}WHEREId={5}",Mysql,friendshipPolicyId,txtName.Text.Trim(),cboStar.SelectedIndex+1,cboBloodType.SelectedIndex+1,UserHelper.loginId);returnMysql;}41 四川职业技术学院计科系论文5.7头像选择界面设计在“个人信息”窗口中单击头像旁边的按纽,弹出“头像选择“窗口。如图5-20所示:图5-20头像选择界面头像列表要求使用Listview控键实现。双击窗口中头像或者单击“确定”按纽,更新“个人信息”窗口中的头像。关键代码如下://确定选择头像privatevoidbtnOK_Click(objectsender,EventArgse){if(lvFaces.SelectedItems.Count==0){MessageBox.Show("请选择一个头像!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);}else{intfaceId=lvFaces.SelectedItems[0].ImageIndex;//获得当前选中的头像的索引personalInfoForm.ShowFace(faceId);//设置个人信息窗体中显示的头像this.Close();}}//双击时选择头像privatevoidlvIcons_MouseDoubleClick(objectsender,MouseEventArgse){intfaceId=lvFaces.SelectedItems[0].ImageIndex;//获得当前选中的头像的索引personalInfoForm.ShowFace(faceId);//设置个人信息窗体中显示的头像41 四川职业技术学院计科系论文this.Close();}5.8系统消息界面设计单击主窗体低部的“验”字样按纽,弹出“系统消息”窗口,显示向该用户发送的未读的添加好友请求消息。窗口如图5-21所示:图5-21系统消息界面如无好友请求消息,则显示如图5-22所示:图5-22无好友请求消息41 四川职业技术学院计科系论文窗体加载时的流程图如图5-23所示:窗体加载扫描数据库N有未读信息?YN信息为添加好友信息?Y将该信息置为已读读出信息显示在窗体中图5-23系统消息界面流程图单击“同意”按纽,实现对方添加当前用户为好友的操作。其关键代码如下://同意添加好友请求privatevoidbtnAllow_Click(objectsender,EventArgse){//先查找是否已经添加过了,防止重复添加stringMysql=string.Format("SELECTCOUNT(*)FROMFriendsWHEREHostId={0}ANDFriendId={1}",this.fromUserId,UserHelper.loginId);try{MysqlCommandcommand=newMysqlCommand(Mysql,DBHelper.connection);DBHelper.connection.Open();intnum=Convert.ToInt32(command.ExecuteScalar());if(num<=0)//没有好友记录{Mysql=string.Format(41 四川职业技术学院计科系论文"INSERTINTOFriends(HostId,FriendId)VALUES({0},{1})",this.fromUserId,UserHelper.loginId);command.CommandText=Mysql;//重新指定Mysql语句//执行添加操作command.ExecuteNonQuery();}}catch(Exceptionex){Console.WriteLine(ex.Message);}finally{DBHelper.connection.Close();}this.Close();//关闭窗体41 四川职业技术学院计科系论文结束语本次论文的目的旨在通过C#实现更为人性化的网络聊天工具,且本次论文是在罗惠琼老师的指导下完成的。在论文撰写阶段初期,因自己编程基础知识不牢固,上机不多,所以在程序设计中,有许多不懂的地方要逼着自己去翻书考证,这也使得自己巩固了知识,同时也给了自己一个教训。在论文的研究过程中,罗惠琼老师不仅给予了指导,并提供了很多与该研究相关的重要资料与信息,培养了我对科学研究的严谨态度和创新精神。我相信这将非常有利于我今后的学习和工作。在此表示衷心的感谢。本次论文还得到了论文组其他同学的帮助与支持,在此一并表示感谢。最后感谢全班同学和辅导员以及所有科任老师在这两年中对我学习上以及生活上的关心与帮助,使我的本科生活能够画上一个圆满的句号。41 四川职业技术学院计科系论文参考文献[1]王小科、张宏宇、吕双.VisualC#2005.人民邮电出版社.2007[2]马俊、何欣.C#网络编程及应用.机械工业出版社.2008[3]唐政、房大伟.C#项目开发全程实录.清华大学出版社.2008[4]张跃廷、王小科.C#程序开发范例宝典.人民邮电出版社.2007[5]AnthonyJones.Windows网络编程.清华大学出版社.200441 四川职业技术学院计科系论文附录一图1数据库中表之间的关系41 四川职业技术学院计科系论文附录二两个添加的辅助类:DBHelper、UserHelper.usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data.MysqlClient;namespaceQQ{//数据库帮助类,维护数据库连接字符串和数据库连接对象classDBHelper{privatestaticstringconnString="server=115.159.50.208;UserId=spak;password=(此处是我的服务器密码);Database=spak";//创建连接数据库的字符串publicstaticMySqlConnectionconnection=newMySqlConnection(connString);//设置MysqlConnection对象连接数据库的字符串}}usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceQQ{//记录登录的用户IdclassUserHelper{publicstaticintloginId;//登录的用户Id}}41