基于C#的网络聊天软件的设计与实现.docx
《基于C#的网络聊天软件的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于C#的网络聊天软件的设计与实现.docx(50页珍藏版)》请在冰豆网上搜索。
基于C#的网络聊天软件的设计与实现
第一章引言
1.1系统开发背景
当今社会已进入信息时代,信息是当今世界最重要的资源之一,它与物质及能源一起构成了三大能源支柱。
信息高速公路是信息社会的基础设施,而互联网则是信息高速公路的重要组成部分。
在互联网相当普及的今天,你们对网络的依赖越来越大,越来越离不开网络,网络聊天更是成为了人们的“家常便饭”。
通过网络聊天工具,人们足不出户就可进行闲聊甚至工作会谈,极大地方便了人们的日常生活与工作需求。
常用的网络聊天工具主要是QQ与MSN。
MSN主要用于国际,而国内的主流网络聊天工具是QQ。
QQ有着非常良好的操作界面,和强大的通信功能,集娱乐、生活和工作于一身。
随着技术的进步,QQ不仅可以通过宽带网在PC上使用,通过手机也可以实现与好友、同事通信。
而无论是QQ还是MSN,都存在一个很大的问题——广告。
每次登陆后时不时会弹出一些广告窗口,绝大多数网友都对此感觉厌烦。
因此在本次论文的激励下,我决定设计一个类似QQ并且无垃圾信息的网络聊天工具,此外也希望通过本次论文能更好地学习与掌握网络软件编程知识。
1.2聊天软件的开发目标
本论文的主要工作是设计一个类似QQ的网络即时聊天工具,主要是采用WinForms+ADO.NET技术实现。
软件功能主要包括用户注册、用户登录、用户间聊天、查找/添加好友、个人设置等。
客户端通过公共的数据库交换信息,消息的发送和读取都是通过操作数据库来完成的。
在程序中采用定时扫描数据库的方式来查找未读消息。
文章首先简介涉及的相关技术与基本知识,然后阐述本软件的功能,再具体分析软件各个模块的功能及具体实现方法。
第二章开发环境与关键技术简介
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关键字来引用其他命名空间的内容。
基本的数据类型
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关键字用在将在事件发生的时候被当成代理调用的方法声明。
2.2.NETFramework简介
.NETFramework是支持生成、运行下一代应用程序和XMLWebServices的内部Windows组件,它简化了在高度分布式Internet环境中的应用程序开发,.NETFramework可实现的功能如下:
●提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在Internet上分布,或者是在远程执行的。
●提供一个将软件部署和版本控制冲突最小化的代码执行环境。
●提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。
●提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
●使开发人员的经验在面对类型大不相同的应用程序(如基于Windows的应用程序和基于Web的应用程序)时保持一致。
●按照工业标准生成所有通信,以确保基于.NETFramework的代码可与任何其他代码集成。
.NETFramework具有两个主要组件:
公共语言运行库和.NETFramework类库。
公共语言运行库是.NETFramework的基础。
您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。
这类似于Java的虚拟机。
事实上,代码管理的概念是公共语言运行库的基本原则。
以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。
.NETFramework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序(如Web窗体和XMLWebservices)。
.NETFramework可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。
.NETFramework不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。
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所示。
图2-1客户机/服务器通信结构示图
2.5ADO.NET技术
ADO.NET是一组用于和数据源进行交互的面向对象类库。
通常情况下,数据源是数据库,但它同样也能够是文本文件、Excel表格或者XML文件。
ADO.NET允许和不同类型的数据源以及数据库进行交互。
然而并没有与此相关的一系列类来完成这样的工作。
因为不同的数据源采用不同的协议,所以对于不同的数据源必须采用相应的协议。
一些老式的数据源使用ODBC协议,许多新的数据源使用OleDb协议,并且现在还不断出现更多的数据源,这些数据源都可以通过.NET的ADO.NET类库来进行连接。
ADO.NET提供与数据源进行交互的相关的公共方法,但是对于不同的数据源采用一组不同的类库。
这些类库称为DataProviders,并且通常是以与之交互的协议和数据源的类型来命名的。
然而无论使用什么样的DataProvider,你将使用相似的对象与数据源进行交互。
SqlConnection对象管理与数据源的连接。
SqlCommand对象允许你与数据源交流并发送命令给它。
为了对进行快速的只“向前”地读取数据,使用SqlDataReader。
如果想使用断开数据,使用DataSet并实现能进行读取或者写入数据源的SqlDataAdapter。
2.6SQLServer2005数据库简介
SQLServer2005是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理。
SQLServer2005数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
SQLServer2005数据引擎是本企业数据管理解决方案的核心。
此外SQLServer2005结合了分析、报表、集成和通知功能。
这使您的企业可以构建和部署经济有效的BI解决方案,帮助您的团队通过记分卡、Dashboard、Webservices和移动设备将数据应用推向业务的各个领域。
与MicrosoftVisualStudio、MicrosoftOfficeSystem以及新的开发工具包(包括BusinessIntelligenceDevelopmentStudio)的紧密集成使SQLServer2005与众不同。
无论您是开发人员、数据库管理员、信息工作者还是决策者,SQLServer2005都可以为您提供创新的解决方案,帮助您从数据中更多地获益。
SQLServer2005通过在可伸缩性、数据集成、开发工具和强大的分析等方面的革新更好的确立了微软在BI领域的领导地位。
SQLServer2005能够把关键的信息及时的传递到组织内员工的手中,从而实现了可伸缩的商业智能。
从CEO到信息工作者,员工可以快速的、容易的处理数据,以更快更好的做出决策。
SQLServer2005全面的集成、分析和报表功能使企业能够提高他们已有应用的价值,即便这些应用是在不同的平台上。
商业智能增强体现在以下几个方面:
端到端的集成BI平台
集成服务
分析服务
报表服务
MicrosoftOfficeSystem的集成
本网络聊天软件的开发环境主要使用SQLServer2005的开发版。
SQLServer2005DeveloperEdition(32位和64位)
DeveloperEdition使开发人员可以在SQLServer上生成任何类型的应用程序。
它包括SQLServer2005EnterpriseEdition的所有功能,但有许可限制,只能用于开发和测试系统,而不能用作生产服务器。
DeveloperEdition是独立软件供应商(ISV)、咨询人员、系统集成商、解决方案供应商以及创建和测试应用程序的企业开发人员的理想选择。
DeveloperEdition可以根据生产需要升级至SQLServer2005EnterpriseEdition。
第三章需求分析
3.1可行性研究
本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。
开发所需要的平台已经搭建好,并做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与C#开发环境的严密契合能力,加之相类似的更大规模的网络聊天工具产品也已有例在先,所以这个程序的开发在技术上是完全可行的。
3.2用户需求
随着互联网的普及,网络聊天工具已经成为了人们日常生活中不可缺少的一部分。
根据人们对聊天工具的需求,主要可以概括为以下几点:
1、操作简单方便、界面简洁美观;
2、能够注册新用户;
3、拥有熟悉的聊天界面;
4、能够查找/添加好友;
5、能够进行个人设置;
6、系统运行稳定、安全可靠。
3.3性能需求
首先要求程序要完全可靠,可以应付各种由于系统问题产生的错误,比如初始网络失败等。
要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。
程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。
开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能够清晰的理解整个系统的设计思路以及实现细节。
要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。
并且不发生内存泄漏之类影响系统运行的错误事件。
并且要求易于维护及扩展。
所以应该采用模块化开发,各个模块之间不要有太多的耦合,以免维护困难。
3.4系统功能需求
这个程序要实现的功能如下:
(1)程序启动之后就能直接进入登陆界面,输入错误时会提示。
(2)登陆界面有注册新用户选项,点击进入注册界面。
(3)注册成功后会提示自动生成的QQ号码。
(4)登陆后进入主界面,用户可以添加好友,可以直接查找,也可以按条件查找,还可以查看所有用户。
(5)当双击列表中某个用户头像的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。
(6)聊天界面要人性化,下面是发送框,上面对方发来的上一条聊天记录。
(7)可以修改自己的个人资料,也可以更换头像。
第四章系统设计
4.1系统功能结构
图4-1系统功能结构
4.2系统模块划分
登录模块:
实现用户登录功能。
在没有账号的情况下可以选择进入注册新用户界面。
注册模块:
实现注册新用户功能。
注册信息包括必填基本资料与选填资料。
主模块:
实现列表功能。
列表包括好友列表与陌生人列表。
通过主界面可以进行聊天功能,也可以打开查找/添加好友功能与个人设置功能等。
聊天模块:
实现发送消息与接收消息功能。
通过公共的数据库交换信息,消息的发送和读取都是通过操作数据库来完成的。
在程序中采用定时扫描数据库的方式来查找未读消息。
也能实现删除好友功能。
查找/添加好友模块:
实现查找好友功能与添加好友功能。
主要方法有精确查找、按条件查找,与查看所有用户。
个人设置模块:
实现修改个人资料。
更换头像模块:
实现更换用户头像。
系统消息模块:
实现添加好友信息的读取。
4.3系统整体流程图
该网络聊天工具系统整体流程图如图4-2所示:
图4-2系统整体流程图
第五章详细设计
5.1登录界面设计
当用户运行程序时,首先进入的是登录界面,如图5-1所示:
图5-1登录界面
如果没有账号,则单击“注册新用户”标签,可以打开注册界面;
如果有已注册的账号,则在输入账号与密码后,点击“登录”按钮,可以打开主界面。
如果输入有误,则出现图5-2所示界面:
图5-2输入错误
程序也不允许在账号或密码处输入空格字符,如有此情况,则会出现图5-3与图5-4所示界面:
图5-3未输入账号
图5-4未输入密码
当点击“登录”按钮时,则触发登录按钮事件,其处理流程图如图5-5所示:
图5-5登录事件流程图
其中登录按钮的代码实现如下:
//登录按钮事件处理
privatevoidbtnLogin_Click(objectsender,EventArgse)
{
boolerror=false;//标志在执行数据库操作的过程中是否出错
//如果输入验证成功,就验证身份,并转到相应的窗体
if(ValidateInput())
{
intnum=0;//数据库操作结果
try
{
//查询用的sql语句
stringsql=string.Format("SELECTCOUNT(*)FROMUsersWHEREId={0}ANDLoginPwd='{1}'",
int.Parse(txtLoginId.Text.Trim()),txtLoginPwd.Text.Trim());
//创建Command对象
SqlCommandcommand=newSqlCommand(sql,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();//显示窗体
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;
}
5.2注册界面设计
当在登录界面点击“注册新用户”标签时,将打开注册界面,如图5-6所示:
图5-6注册界面
其中基本资料为必填资料,详细资料为选填资料。
在用户输入完资料后,点击“确认注册”按钮进行注册。
其间会对相关的输入进行检查,如果输入不符合规范,则不允许注册,不会向数据库插入记录,并会提示错误原因。
如果输入正确,则向数据库插入一条用户记录,在数据库中自动生成一个新的登录号码(Users表的Id字段),以消息框的形式告诉用户申请成功的号码。
其流程图如图5-7所示:
图5-7注册界面流程图
其中确认注册按钮的代码实现如下:
//点击注册,向数据库添加记录
privatevoidbtnRegist_Click(objectsender,EventArgse)
{
//输入验证通过,就插入记录到数据库
if(ValidateInput())
{
intmyQQNum=0;//QQ号码
stringmessage;//弹出的消息
stringsex=rdoMale.Checked?
rdoMale.Text:
rdoFemale.Text;//获得选中的性别
stringsql="";//查询用的SQL语句
intstarId;//星座Id
intbloodTypeId;//血型Id
boolerror=false;//操作数据库是否出错
//根据星座和血型的选择来分情况确定SQL语句
if(cboStar.Text!
=""&&cboB