admin 管理员组

文章数量: 887021


2023年12月24日发(作者:it基础知识入门课程)

摘 要

作为除电视、报纸、广播之外的第四大媒体,互联网不仅成为人们获取新闻信息的主要来源,更成为了人们闲暇之余的一种休闲手段。随着互联网技术的发展,各种各样基于网络的应用也随之诞生,网络聊天工具便是其中的一种。本文采用Visual Studio 2008+SQL Server 2005开发环境,结合WinForms、等多种技术,实现了一个类似QQ的网络聊天工具,并在WINDOWS平台上加以了实现。通过C#语言进行网络编程,通过公共的数据库交换各种信息,实现了人性化的界面设计与功能设计。软件经过测试,满足现代人们即时通信的需求,达到预期的设计效果,对网络聊天工具的人性化设计具有一定的现实意义,同时也为其他相关项目的设计提供了参考。

关键词:网络聊天工具 C# 即时通信 数据库 人性化

Abstract

Internet is the fourth major media other than televisions, newspapers and

broadcasting, acting not only as a major source of news information, it is

also a means of recreation for people during their leisure. Along with the

network were born,one of them is online chat tool.

This thesis develops a

online chat tool which like QQ and based on the integration of various

technologies such as WinForms, etc,and based on the adoption

of Visual Studio 2008+SQL Server 2005 development environment, then

implement it on WINDOWS platform. It used C # language for network

programming,and exchange different information through common

database for the implemention of the and function design. After going

through the tests, this online chat tool can achieve the projected design

purpose of instantaneous communication

needs of people in modern times,

it also poses certain realistic significance to the of online chat tool and

provides as a reference to the design of other relevant projects.

Key words:

online chat tool C# instantaneous communication

database

目 录

第一章 引言 ..............................................................................................................................1.1 系统开发背景 .................................................................................................................1.2 聊天软件的开发目标 .....................................................................................................第二章 开发环境与关键技术简介 .........................................................................................2.1 C#简介 .............................................................................................................................2.2 .NET Framework简介 ...................................................................................................2.3 WinForms窗体设计技术 ...............................................................................................2.4 CS结构 ............................................................................................................................2.5 技术 ...............................................................................................................2.6 SQL Server 2005数据库简介 ........................................................................................第三章 需求分析......................................................................................................................3.1 可行性研究 .....................................................................................................................3.2 用户需求 .........................................................................................................................3.3 性能需求 .........................................................................................................................3.4 系统功能需求 .................................................................................................................第四章 系统设计......................................................................................................................4.1 系统功能结构 .................................................................................................................4.2 系统模块划分 .................................................................................................................4.3 系统整体流程图 .............................................................................................................第五章 详细设计......................................................................................................................5.1 登录界面设计 .................................................................................................................5.2 注册界面设计 .................................................................................................................5.3 主界面设计 .....................................................................................................................

5.4 查找添加好友界面设计 .................................................................................................5.5 聊天界面设计 .................................................................................................................5.6 个人设置界面设计 .........................................................................................................5.7 头像选择界面设计 .........................................................................................................5.8 系统消息界面设计 .........................................................................................................结束语 ........................................................................................................................................参考文献 ....................................................................................................................................附录一 ........................................................................................................................................附录二 ........................................................................................................................................

第一章 引言

1.1 系统开发背景

当今社会已进入信息时代,信息是当今世界最重要的资源之一,它与物质及能源一起构成了三大能源支柱。信息高速公路是信息社会的基础设施,而互联网则是信息高速公路的重要组成部分。

在互联网相当普及的今天,你们对网络的依赖越来越大,越来越离不开网络,网络聊天更是成为了人们的“家常便饭”。通过网络聊天工具,人们足不出户就可进行闲聊甚至工作会谈,极大地方便了人们的日常生活与工作需求。

常用的网络聊天工具主要是QQ与MSN。MSN主要用于国际,而国内的主流网络聊天工具是QQ。QQ有着非常良好的操作界面,和强大的通信功能,集娱乐、生活和工作于一身。随着技术的进步,QQ不仅可以通过宽带网在PC上使用,通过手机也可以实现与好友、同事通信。而无论是QQ还是MSN,都存在一个很大的问题——广告。每次登陆后时不时会弹出一些广告窗口,绝大多数网友都对此感觉厌烦。因此在本次论文的激励下,我决定设计一个类似QQ并且无垃圾信息的网络聊天工具,此外也希望通过本次论文能更好地学习与掌握网络软件编程知识。

1.2 聊天软件的开发目标

本论文的主要工作是设计一个类似QQ的网络即时聊天工具,主要是

采用WinForms+技术实现。软件功能主要包括用户注册、用户登录、用户间聊天、查找添加好友、个人设置等。客户端通过公共的数据库交换信息,消息的发送和读取都是通过操作数据库来完成的。在程序中采用定时扫描数据库的方式来查找未读消息。文章首先简介涉及的相关技术与基本知识,然后阐述本软件的功能,再具体分析软件各个模块的功能及具体实现方法。

第二章 开发环境与关键技术简介

2.1 C#简介

C#(读作C Sharp)是微软公司发布的一种面向对象的、运行于.NET

Framework之上的高级程序设计语言,

是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,

而且它是微软公司.NET windows网络框架的主

角。

C#最引人入胜的地方是它和Java的不同,而不是相似的地方:

中间代码

微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地。微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码。它也明白许多,如果不是大多数的话,程序员认为Java程序要不可避免的比C编写的任何东西都要慢。而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码。当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布。但是Java JIT编译器的普遍存在使得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 .NET Framework简介

.NET Framework是支持生成、运行下一代应用程序和XML Web

Services的内部Windows组件,它简化了在高度分布式Internet环境中的应用程序开发,.NET Framework可实现的功能如下:

 提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。

 提供一个将软件部署和版本控制冲突最小化的代码执行环境。

 提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。

 提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。

 使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。

 按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。

.NET Framework 具有两个主要组件:公共语言运行库和.NET

Framework类库。

公共语言运行库是 .NET Framework 的基础。您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。这类似于Java的虚拟机。事实上,代码管理的概念是公共语言运行库的基本原则。以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。

.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 所提供的最新创新的应用程序(如 Web 窗体和

XML Web services)。

.NET Framework 可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NET Framework 不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。

2.3 WinForms窗体设计技术

WinForm是.Net开发平台中对Windows Form的一种称谓。.Net

为开发WinForm的应用程序提供了丰富的Class Library(类库)。这些WinFrom 类库支持RAD(快速应用程序开发),这些类库被封装在一个名称空间之中,这个名称空间就是。在此名称空间中定义了许多类,在开发基于.Net的GUI应用程序的时候,

就是通过继承和扩展这些类才使得我们的程序有着多样的用户界面。

2.4 CS结构

CS (ClientServer)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是ClientServer形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和ClientServer 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

CS结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。ClientServer模型最终可归结为一种“请求应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答,如图2-1所示。

图2-1 客户机服务器通信结构示图

2.5 技术

是一组用于和数据源进行交互的面向对象类库。通常情况下,数据源是数据库,但它同样也能够是文本文件、Excel表格或者XML文件。

允许和不同类型的数据源以及数据库进行交互。然而并没有与此相关的一系列类来完成这样的工作。因为不同的数据源采用不同的协议,所以对于不同的数据源必须采用相应的协议。一些老式的数据源使用ODBC协议,许多新的数据源使用OleDb协议,并且现在还不断出现更多的数据源,这些数据源都可以通过.NET的类库来进行连接。

提供与数据源进行交互的相关的公共方法,但是对于不同的数据源采用一组不同的类库。这些类库称为Data Providers,并

且通常是以与之交互的协议和数据源的类型来命名的。然而无论使用什么样的Data Provider,你将使用相似的对象与数据源进行交互。SqlConnection对象管理与数据源的连接。SqlCommand对象允许你与数据源交流并发送命令给它。为了对进行快速的只“向前”地读取数据,使用SqlDataReader。如果想使用断开数据,使用DataSet并实现能进行读取或者写入数据源的SqlDataAdapter。

2.6 SQL Server 2005数据库简介

SQL Server 2005 是一个全面的数据库平台,使用集成的商业智能 (BI) 工具提供了企业级的数据管理。SQL Server 2005 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序 。

SQL Server 2005 数据引擎是本企业数据管理解决方案的核心。此外 SQL Server 2005 结合了分析、报表、集成和通知功能。这使您的企业可以构建和部署经济有效的 BI 解决方案,帮助您的团队通过记分卡、Dashboard、Web services 和移动设备将数据应用推向业务的各个领域。

与 Microsoft Visual Studio、Microsoft Office System 以及新的开发工具包(包括 Business Intelligence Development Studio)的紧密集成使 SQL Server 2005 与众不同。无论您是开发人员、数据库管理员、信息工作者还是决策者,SQL Server 2005 都可以为您提供创新的解决方案,帮助您从数据中更多地获益。

SQL Server 2005 通过在可伸缩性、数据集成、开发工具和强大的分析等方面的革新更好的确立了微软在BI领域的领导地位。SQL

Server 2005 能够把关键的信息及时的传递到组织内员工的手中,从而实现了可伸缩的商业智能。从CEO 到信息工作者,员工可以快速的、容易的处理数据,以更快更好的做出决策。SQL Server 2005全面的集成、分析和报表功能使企业能够提高他们已有应用的价值,即便这些应用是在不同的平台上。

商业智能增强体现在以下几个方面:

端到端的集成BI平台

集成服务

分析服务

报表服务

Microsoft Office System的集成

本网络聊天软件的开发环境主要使用SQL Server 2005的开发版。

SQL Server 2005 Developer Edition(32位和64 位)

Developer Edition 使开发人员可以在SQL Server 上生成任何类型的应用程序。它包括 SQL Server 2005 Enterprise Edition 的所有功能,但有许可限制,只能用于开发和测试系统,而不能用作生产服务器。Developer Edition 是独立软件供应商(ISV)、咨询人员、系统集成商、解决方案供应商以及创建和测试应用程序的企业开发人员的理想选择。Developer Edition 可以根据生产需要升级至SQL Server 2005 Enterprise Edition。

第三章 需求分析

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 登录事件流程图

其中登录按钮的代码实现如下:

登录按钮事件处理

private void btnLogin_Click(object sender, EventArgs e)

{

bool error = false; 标志在执行数据库操作的过程中是否出错

如果输入验证成功,就验证身份,并转到相应的窗体

if (ValidateInput())

{

int num = 0; 数据库操作结果

try

{

查询用的sql语句

string sql = ("SELECT COUNT(*) FROM

Users WHERE Id={0} AND LoginPwd = '{1}'",

(()),

());

创建Command 对象

SqlCommand command = new SqlCommand(sql,

tion);

(); 打开数据库连接

num = 32(eScalar());

}

catch (Exception ex)

{

error = true;

ine(e);

}

finally

{

(); 关闭数据库连接

}

if (!error && (num == 1)) 验证通过

{

设置登录的用户号码

d = (());

创建主窗体

MainForm mainForm = new MainForm();

(); 显示窗体

e = false; 当前窗体不可见

}

else

{

("输入的用户名或密码有误!", "登录提示", , );

}

}

}

用户输入验证

private bool ValidateInput()

{

验证用户输入

if (() == "")

{

("请输入登录的号码", "登录提示",

, ation);

();

return false;

}

else if (() == "")

{

("请输入密码", "登录提示",

, ation);

();

return false;

}

return true;

}

5.2 注册界面设计

当在登录界面点击“注册新用户”标签时,将打开注册界面,如图5-6所示:

图5-6 注册界面

其中基本资料为必填资料,详细资料为选填资料。在用户输入完资料后,点击“确认注册”按钮进行注册。其间会对相关的输入进行检查,如果输入不符合规范,则不允许注册,不会向数据库插入记录,并会提示错误原因。如果输入正确,则向数据库插入一条用户记录,在数据库中自动生成一个新的登录号码(Users表的Id字段),以消息框的形式告诉用户申请成功的号码。其流程图如图5-7所示:

图5-7 注册界面流程图

其中确认注册按钮的代码实现如下:

点击注册,向数据库添加记录

private void btnRegist_Click(object sender, EventArgs e)

{

输入验证通过,就插入记录到数据库

if (ValidateInput())

{

int myQQNum = 0; QQ号码

string message; 弹出的消息

string sex = d ? : ;

获得选中的性别

string sql = ""; 查询用的SQL语句

int starId; 星座Id

int bloodTypeId; 血型Id

bool error = false; 操作数据库是否出错

根据星座和血型的选择来分情况确定SQL语句

if ( != "" && != "")

{

获得星座的Id

starId = GetStarId();

获得血型的Id

bloodTypeId = GetBloodType();

sql = ("INSERT INTO Users (LoginPwd,

NickName, Sex, Age, Name, StarId, BloodTypeId) values

('{0}','{1}','{2}',{3},'{4}',{5},{6})",

(), (), sex,

(()), (), starId, bloodTypeId);

}

else if ( != "" && == "")

{

获得星座的Id

starId = GetStarId();

sql = ("INSERT INTO Users (LoginPwd,

NickName, Sex, Age, Name, StarId) values ('{0}','{1}','{2}',{3},'{4}', {5})",

(), (),

sex, (()), (),starId);

}

else if ( == "" && != "")

{

获得血型的Id

bloodTypeId = GetBloodType();

sql = ("INSERT INTO Users (LoginPwd,

NickName, Sex, Age, Name, BloodTypeId) values ('{0}','{1}','{2}',{3},'{4}', {5})",

(), (),

sex, (()), (), bloodTypeId);

}

else

{

sql = ("INSERT INTO Users (LoginPwd,

NickName, Sex, Age, Name) values ('{0}','{1}','{2}',{3},'{4}')",

(),

(), sex, (()), ());

}

try

{

创建Command 对象

SqlCommand command = new SqlCommand(sql,

tion);

(); 打开数据库连接

int result = eNonQuery(); 执行插入命令

if (result == 1)

{

sql = "SELECT @@Identity FROM Users"; 查询新增加的记录的标识号

commandmandText = sql; 重新指定Command 对象的SQL 语句

myQQNum =

32(eScalar()); 强制类型转换会出错

message = ("注册成功!你的MyQQ号码是{0}", myQQNum);

}

else

{

message = "注册失败,请重试!";

}

}

catch (Exception ex)

{

error = true;

message = "服务器出现意外错误!请稍候再试!";

ine(e);

}

finally

{

(); 关闭数据库连接

}

显示注册结果

if (error)

{

(message, "注册失败",

, g);

}

else

{

(message, "注册结果",

, ation);

}

();

}

}

5.3

主界面设计

当用户输入正确的登录信息并登录后,出现图5-8所示的主界面:

图5-8 主界面

登陆后在“我的好友”列表中显示当前好友列表,包括好友的头像和昵称。在主界面的顶部要显示当前登陆的用户头像,昵称和登录账号。

当有新的聊天消息时候。发来的消息的好友头像要闪动,双击头像弹出“聊天”窗口后,头像停止闪动,当有添加好友请求消息时,窗体底部的好友请求验证按钮要闪烁,单击该按钮弹出“系统消息”窗体后,按钮停止闪烁。

通过主窗体下方的按纽打开“查找添加好友”窗体,“个人信息”窗口,“系统消息”窗口,也可刷新好友列表和退出程序。

通过右键菜单能够切换大小头像。能够把陌生人转为好友,能够删除一个好友或陌生人,如图5-9所示:

图5-9 右键功能

显示好友列表的控键可以用提供的第三方控键sidebar,该控键的命名空间为。Sidebar是一个能够以分组形式显示列表的控件,能够实现类似QQ的好友分组功能,sidebar控键中可以包含很多组(sbgroup),每个组可以包含很多sidebar项(sbitem)。Sidebar的列表项有两种显示方式:大图标和小图标,它可以通过它的view属性来设置。Sidebar 控件

还有一个imagelist 属性,可以和一个imagelist控件关联,列表项中显示的图片就是存放在imagelist控件中的图片。可以通过Sidebar项(sbitem)的imageindex来指定图片在imagelist控件中的索引。

其中加载窗体时的代码如下:

窗体加载时发生

private void MainForm_Load(object sender, EventArgs e)

{

工具栏的消息图标

= [0];

显示个人的信息

ShowSelfInfo();

添加 SideBar 的两个组

up("我的好友");

up("陌生人");

向我的好友组中添加我的好友列表

ShowFriendList();

}

定时扫描数据库读取未读信息的代码如下:

定时扫描数据库,找到未读消息

private void tmrMessage_Tick(object sender, EventArgs e)

{

ShowFriendList(); 刷新好友列表

int messageTypeId = 1; 消息类型

int messageState = 1; 消息状态

找出未读消息对应的好友Id

string sql = (

"SELECT Top 1 FromUserId, MessageTypeId, MessageState

FROM Messages WHERE ToUserId={0} AND MessageState=0",

d);

SqlCommand command;

消息有两种类型:聊天消息、添加好友消息

try

{

command = new SqlCommand(sql, tion);

();

SqlDataReader dataReader = eReader();

循环读出一个未读消息

if (())

{

erId = (int)dataReader["FromUserId"];

messageTypeId = (int)dataReader["MessageTypeId"];

messageState = (int)dataReader["MessageState"];

}

();

}

catch (Exception ex)

{

ine(e);

}

finally

{

();

}

判断消息类型,如果是添加好友消息,就启动喇叭timer,让小喇叭闪烁

if (messageTypeId == 2 && messageState == 0)

{

SoundPlayer player = new SoundPlayer("");

();

();

}

如果是聊天消息,就启动聊天timer,让好友头像闪烁

else if (messageTypeId == 1 && messageState == 0)

{

获得发消息的人的头像Id

sql = "SELECT FaceId FROM Users WHERE Id=" +

erId;

try

{

command = new SqlCommand(sql, tion);

();

FaceId =

32(eScalar()); 设置发消息的好友的头像索引

}

catch (Exception ex)

{

ine(e);

}

finally

{

();

}

如果发消息的人没有在列表中就添加到陌生人列表中

if (!HasShowUser(fromUserId))

{

UpdateStranger(fromUserId);

}

SoundPlayer player = new SoundPlayer("");

();

(); 启动闪烁头像定时器

}

}

5.4 查找添加好友界面设计

在主界面中单击“查”字样按钮后,出现查找添加好友界面如图5-10所示:

图5-10 查找添加好友界面

直接点击“查找”后,即查找所有用户,查询结果如图5-11所示:

图5-11 基本查找

单击“上一步”则回到“基本查找”页面。点击“精确查找”,如图5-12所

示:

图5-12 精确查找

输入帐号或昵称,点击“查找”可以显示查询结果。

“高级查找”界面如图5-13所示:

图5-13 高级查找

操作方法同基本查找类似。

单击“查找”按纽后在窗体中显示查询结果。要求以DataGridView 控件显示查找的结果。选中一个用户,单击“加为好友”按纽,进行添加好友的操作,并根据不同的情况弹出消息对话框,告知用户如“添加好友请求成功”,“对方不让任何人添加他为好友“,“对方需要身份验证,已发出验证请求”等。如果需要身份验证,不要求输入验证消息内容,直接发送验证消息即可。

添加好友的流程图如图5-14所示:

图5-14 添加好友流程图

其中基本查找和高级查找两部分的代码如下:

基本查找

private void BasicallySearch()

{

string sql = "";

查询语句的前半部分

sql = "SELECT Id,NickName,Age,Sex FROM Users";

精确查找

if (d == true)

{

if (() == "" && () ==

"")

{

("还没有填查询条件呢!", "提示",

, ation);

return;

}

按帐号查找

else if (() != "")

{

sql += (" WHERE Id={0}",

(()));

}

按昵称查找

else

{

sql += (" WHERE NickName like '%{0}%'",

());

}

}

重新填充DataSet

[0].Clear();

CommandmandText = sql;

(dataSet, "Users");

设置控件可见的属性

调整显示结果的panel的位置,让它和显示条件的Panel的位置相同

on = on;

使显示结果的panel可见

e = true;

e = true; “加为好友”按钮可见

e = true; “上一步”按钮可见

}

高级查找

private void AdvancedSearch()

{

string sql = "";

查询语句的前半部分

sql = "SELECT Id,NickName,Age,Sex FROM Users";

string ageCondition = ""; 年龄条件

string sexCondition = ; 性别条件

确定年龄的范围

switch (edIndex)

{

case 1:

ageCondition = " Age>=0 AND Age<10";

break;

case 2:

ageCondition = " Age>=10 AND Age<20";

break;

case 3:

ageCondition = " Age>=20 AND Age<30";

break;

case 4:

ageCondition = " Age>=30 AND Age<40";

break;

case 5:

ageCondition = " Age>=40 AND Age<50";

break;

case 6:

ageCondition = " Age>=50";

break;

default:

ageCondition = "";

break;

}

if (ageCondition == "" && sexCondition == "")

{

("还没有选择查询条件呢!", "提示",

, ation);

return;

}

else

{

if (ageCondition != "" && sexCondition == "")

{

sql += (" WHERE {0}", ageCondition);

}

else if (ageCondition == "" && sexCondition != "")

{

sql += (" WHERE Sex='{0}'", sexCondition);

}

else

{

sql += (" WHERE {0} AND Sex='{1}'",

ageCondition, sexCondition);

}

}

开始查找

CommandmandText = sql;

[0].Clear();

(dataSet, "Users");

设置控件的属性

on = on;

e = true;

e = true;

e = true;

}

5.5 聊天界面设计

当有消息时,主窗体中好友头像闪烁,双击头像,弹出“聊天”窗口,如图5-15所示:

图5-15 聊天界面

发送信息的流程图如图5-16所示:

图5-16 发送信息流程图

发送消息部分的关键代码如下:

发送消息

private void btnSend_Click(object sender, EventArgs e)

{

if (() == "") 不能发送空消息

{

("不能发送空消息!", "提示",

, ation);

return;

}

else if (().Length > 50)

{

("消息内容过长,请分为几条发送!", "提示",

, ation);

return;

}

else 发送消息,写入数据库

{

MessageTypeId:1-表示聊天消息,为简化操作没有读取数据表,到S2可以用常量或者枚举实现

MessageState:0-表示消息状态是未读

int result = -1; 表示操作数据库的结果

string sql = (

"INSERT INTO Messages (FromUserId, ToUserId, Message,

MessageTypeId, MessageState) VALUES ({0},{1},'{2}',{3},{4})",

d, friendId, (), 1, 0);

try

{

执行命令

SqlCommand command = new SqlCommand(sql,

tion);

();

result = eNonQuery();

}

catch (Exception ex)

{

ine(e);

}

finally

{

();

}

if (result != 1)

{

("服务器出现意外错误!", "抱歉",

, );

}

= ""; 输入消息清空

();

}

}

读取信息的流程图如图5-17所示:

图5-17 读取信息流程图

读取消息部分的关键代码如下:

读取所有的未读消息,显示在窗体中

private void ShowMessage()

{

string messageIdsString = ""; 消息的Id组成的字符串

string message; 消息内容

string messageTime; 消息发出的时间

读取消息的SQL语句

string sql = (

"SELECT Id, Message,MessageTime From Messages WHERE

FromUserId={0} AND ToUserId={1} AND MessageTypeId=1 AND MessageState=0",

friendId, d);

try

{

SqlCommand command = new SqlCommand(sql,

tion);

();

SqlDataReader reader = eReader();

循环将消息添加到窗体上

while (())

{

messageIdsString += ng(reader["Id"]) + "_";

message = ng(reader["Message"]);

messageTime =

Time(reader["MessageTime"]).ToString(); 转换为日期类型

+= ("n{0} {1}n {2}",

nickName, messageTime, message);

}

();

}

catch (Exception ex)

{

ine(e);

}

finally

{

();

}

把显示出的消息置为已读

if ( > 1)

{

( - 1);

SetMessageRead(messageIdsString, '_');

}

}

把显示出的消息置为已读

private void SetMessageRead(string messageIdsString, char separator)

{

string[] messageIds = (separator); 分割出每个消息Id

string sql = "Update Messages SET MessageState=1 WHERE Id=";

更新状态的SQL语句的固定部分

string updateSql; 执行的SQL语句

try

{

SqlCommand command = new SqlCommand(); 创建Command对象

tion = tion; 指定数据库连接

(); 打开数据库连接

foreach (string id in messageIds)

{

if (id != "")

{

updateSql = sql + id; 补充完整的SQL语句

commandmandText = updateSql; 指定要执行的SQL

语句

int result = eNonQuery(); 执行命令

}

}

}

catch (Exception ex)

{

ine(e);

}

finally

{

();

}

}

5.6 个人设置界面设计

在主界面单击标题栏的头像,或单击工具栏“设”字样按钮,则弹出“个人信息设置”界面,如图5-18所示:

图5-18 个人资料

在“个人信息”窗口能够修改个人的基本资料,也能进行安全设置。安全设置选项界面如图5-19所示:

图5-19 安全设置

在“安全设置”选项窗口中能进行密码修改与身份验证设置。

关键代码如下:

获得更新数据库的SQL语句

private string GetSQL()

{

更新用的sql语句,分成段拼凑

string sql = ("UPDATE Users SET NickName='{0}',

FaceId={1},Sex='{2}',Age={3}",

(), 32(),

(), 32(()));

if (() != "") 如果修改了密码就更新密码字段

{

sql = ("{0} ,LoginPwd='{1}' ", sql,

());

}

添加好友策略,判断哪个但选按钮被选中

int friendshipPolicyId = 0;

if (d)

{

friendshipPolicyId = 32();

}

else if (d)

{


本文标签: 消息 好友 系统 数据库 信息