企业QQ通信系统设计与实现毕业设计.docx
《企业QQ通信系统设计与实现毕业设计.docx》由会员分享,可在线阅读,更多相关《企业QQ通信系统设计与实现毕业设计.docx(32页珍藏版)》请在冰豆网上搜索。
企业QQ通信系统设计与实现毕业设计
宜宾职业技术学院
毕业设计
企业QQ通信系统设计与实现
企业QQ通信系统设计与实现
摘要
企业QQ通信系统可作为企业内部的交流工具使用,虽然通信的安全性不是很高,但是要求信息的响应速度要较快,能让企业内部员工充分享受到网络即时消息的方便和快捷,从而提高工作质量和效率。
本设计采用VisualC++6.0程序,使用C++编程语言进行软件的开发。
主要实现了用户注册、用户登录、用户之间文字聊天、文件传输、语音聊天、视频聊天功能,构成一个实用的、功能完善的聊天软件,达到预期目标;通过运行、测试与分析说明,该多功能聊天软件运行稳定、可靠,具有一定的实用价值。
关键词:
QQ系统;企业通信;VisualC++6.0;C++;数据库
企业QQ通信系统设计与实现
1引言
1.1课题背景
21世纪将是网络化、信息化的世纪,信息的融合已经成为社会发展的主流方向。
简易版企业QQ聊天系统将不断与信息交流领域的系统相互集成和渗透,扩展其自己的功能和应用范围,满足未来话音,数据和视频的多媒体应用需要,使即时消息以更丰富的接入方法,更高的服务质量,更友好的面貌呈现在世人的面前。
从功能角度来看,简易版企业QQ聊天系统向支持全媒体方向发展,随着多媒体技术在网络应用中的发展,简易版企业QQ聊天系统承载的媒体,不再局限于原来的文字、语音和文件的信息交换,信息载体扩展到图形、图像和流媒体等多媒体业务上。
目前ICQ和QQ预设了部分简单的表情图像,通过传输图像代码来传递表情图像,可以被视为即时消息开发商开发支持图形、图像为载体的即时消息软件的开端。
从应用范围角度来看,简易版企业QQ聊天系统集中在Internet个人用户之间的信息交流应用,随着网络技术应用的发展,简易版企业QQ聊天系统应用范围向园区化、集团化拓展,应用领域突破个人,而用于远程教学、远程医疗、远程演示、网络会议等领域。
1.2国内外主要聊天工具的发展状况
中国的大部分网络用户都拥有自己的QQ号码。
腾讯计算机系统有限公司成立于1998年11月。
1999年2月,腾讯自主开发了基于Internet的即时通信网络工具——腾讯即时通信TencentInstantMessenger,简称TIM或腾讯QQ。
腾讯QQ经过三年时间的发展,到2002年,其用户群成为中国最大的互联网注册用户群,注册用户达到1亿6000万,其中活跃用户总数超过5000万。
自此腾讯QQ成为中国最大的即时通信服务提供商。
腾讯公司是中国最早也是目前中国市场上最大的本土互联网即时通信软件开发商。
公司成立10多年以来,一直以追求卓越的技术为导向,始终处于稳健、高速发展的状态。
腾讯QQ超过6亿的注册用户群体现了网络用户对腾讯QQ这一聊天工具的广泛应用。
在当今市场经济高速发展的前提下,腾讯QQ也在不断自我完善,渐渐地演变为一个人性化、市场化的多功能的聊天工具软件,它可以给网络聊天用户带来越来越多的人性化服务:
从原来单一的文字聊天过渡到集语音、视频、文件传输等多功能于一身的聊天软件。
ICQ和MSN是在国外比较盛行的即时聊天工具,腾讯QQ的开发对MSN和ICQ都进行了借鉴。
ICQ是ISeekYou(我找你)的缩写,最初是一家以色列公司开发出来的免费软件,中文名称目前可以称之为“网络呼叫器”,它在全球拥有超过4000万的用户。
事实上这种软件最主要的功能就是让用户知道网络上的朋友现在有没有上线(前提是对方也有安装ICQ),然后可以互送Messages(消息)交谈或是交换档案等等,比电子邮件更具即时性。
正如一位ICQ软件的最初程序设计员所说:
“当你登录因特网之后,你周围都是些自己熟悉的人,而且,你还可以和他们分享这种体验,这的确是一件令人激动的事情。
”
MSN是微软推出的聊天软件,是一套类似ICQ的网上即时通讯软件,它以最简单的方式为用户提供强有力的即时消息支持,同时能使MicrosoftOutlookExpress(R)和MSNHotmail(R)变得更简单易用。
MSNMessengerService还可使用户间的联机交谈变得更加轻松愉快,了解谁在联机以及查看用户何时联机并与其交换即时消息。
用户间可以进行单独的聊天,或者在同一个对话窗口中与多达四个的联系人进行聊天。
自动的输入指示器可让用户知道何时联系人正在输入答复,还可以进行全球电话呼叫——以非常低的费用呼叫世界的任何地方。
用户可以选择所要使用的电话服务提供商,从服务提供商的列表中选择最适合的提供商。
用交谈取代键盘输入,使用计算机上的话筒和扬声器就可以和位于世界各地的朋友进行交谈,甚至可以呼叫联系人将文本消息发送到联系人的移动电话和传呼机上(注:
此特性仅适用于美国和加拿大),而进入“聊天室”结识新朋友,或加入与名人聊天,此特性在所有地区都适用。
用户可以使用MSNMessenger与朋友交换照片、喜爱的音乐或任何其他文件,也可以监视新的电子邮件并查看用户有多少新的电子邮件。
MSNMessenger能在收到新的Hotmail邮件时通知用户,还能邀请联系人进行联机DirectPlay兼容游戏。
1.3本课题研究的意义
此次开发的企业QQ通信系统可作为个人的交流工具使用,通信的安全性不是很高,但要求信息的响应速度要较快,让用户充分享受到网络即时消息的方便和快捷。
本聊天工具由服务器端程序和客户端程序两部分组成,整体采用VisualC++6.0平台开发,并使用Access2003管理数据库数据。
服务器是可以监听和查看用户的基本操作;客户端程序面向实际用户,它有必要的界面的按钮,向用户提供网络即时消息的功能。
2系统需求分析
2.1系统的功能需求分析
本系统的设计目标是实现一个企业内部局域网通信系统,企业内部职工可以方便的进行交流,可以大大的提高职工的工作效率。
根据企业对局域网通信的需求,本系统主要包括信息通信、系统设置、搜索用户、访问公共资源、访问对方主机五大功能。
各功能概述:
信息通信:
信息通信是企业内部通信系统的核心功能,它用于不同职工之间的通信,这种通信方式能够实现多个职工之间的通信,而不存在类似电话占线的问题,增加了任务分配的新方式,从而提高企业的工作效率。
系统设置:
系统设置用于设置用户界面、公共路径、公告栏等的功能。
用户搜索:
用户搜索用于搜索企业局域网内的其他用户,系统会根据用户所设置的IP搜索范围搜索所有计算机上的用户。
访问公共资源:
本功能用于实现企业内部公共服务器上资源访问的功能。
访问对方主机:
本功能用于两人聊天情况下对对方主机的访问和控制的功能。
第一次使用系统的用户通过填写个人信息来注册,服务器返回一个注册ID号给注册用户,用来登录。
已经注册的用户在登录界面填写完相关登录信息,通过服务器的验证后就可以进入客户端界面。
在线用户在添加好友时可以查看所要添加用户的列表信息。
当对要添加的好友发送请求添加的信息后,由该好友验证是否通过请求,同意后会向请求方发送同意添加的消息。
当请求方添加完成后,服务器端会把相关信息存入到好友表的数据库中。
完成以上操作以后,两人即可进行在线聊天。
2.2系统的可行性分析
2.2.1可行性要求、目标
企业内部通信系统必须提供网络通信功能,在通信过程中禁止使用聊天表情、文件传送等功能,避免资料外泄,或因发送错误而导致上机资料的丢失以及其他损失。
最重要的是必须适应任何操作系统,也就是实现跨平台技术,因为企业内部的工作需要,工作环境中使用了多个操作系统来完成不同的工作。
另外,系统不需要使用服务器中转和记录通信内容,可以独立完成通信任务,排除职工对领导监视工作进度等行为的逆反心理。
企业内部通信系统的目标是实现企业的信息化通信,提高企业通信能力,提高任务理解和执行能力,减少没有必要的人员流动和资金损耗,以最快的速度提升企业的市场竞争力。
2.2.2技术可行性分析
局域网通信系统的技术已经非常成熟,首先,从硬件上讲,计算机硬件速度现在已经不是问题,高速便捷的网络已经十分普遍,这些为本系统的运行打下坚实的基础。
从软件的角度上讲,数据库技术已经相当成熟(目前用得比较多的有SQLServer,VisualC++6.0等),并且处理能力也非常强,这为海量数据的存储和处理打下了坚实的基础,同时,使用VisualC++6.0开发程序也相当普遍。
有了这些技术的支持,我们成功开发一个局域网通信系统没有任何技术风险。
2.2.3经济可行性分析
经济可行性主要是对项目的经济效益进行评价。
本系统开发完成后可缩减工作时间,提高工作效率,而且简单易操作,不需对使用人员进行培训,不管是在资金上还是效率上都能达到预期的效果。
本系统开发经费对于企业在经济上是可以接受的,并且本系统实施后可以显著提高工作效率,有助于企业的信息化管理,所以该企业内部通信系统在经济上是可行的。
3系统设计
3.1系统拓扑结构图
企业QQ通信系统分为客户端和服务器端,并且多个客户端可以连接同一个服务器端,通信系统的拓扑结构如图3.1所示。
图3.1企业QQ通信系统拓扑结构图
3.2系统功能结构图
企业QQ通信系统分为客户端和服务器端两个项目。
其中服务器端不但提供接收客户端的链接,还能够对账户进行管理。
服务器端的主要模块如图3.2所示。
客户端只要实现相互之间的消息和文件传递,客户端的主要模块如图3.3所示。
图3.2服务器端
图3.3客户端
3.3网络通信原理分析
企业QQ通信系统使用TCP和UDP两种连接方式进行连接。
客户端使用TCP连接服务器,服务器端是使用UDP进行通信,系统连接模式如图3.4所示。
图3.4连接模式
服务器端和客户端使用Socket建立通信连接的过程如下:
(1)服务器端建立m_SvrSock和m_OrgSock两个套接字句柄。
m_OrgSock和OnOrgMsg函数建立异步通信,端口1201,接收客户端发送的连接请求(FD_ACCEPT)。
在OnOrgMsg函数内将org.xml文件发送到客户端。
m_SvrSock和OnNetEvent函数建立异步通信,端口1200,接收客户端发送的连接请求,接收到客户端的心跳测试和登录请求(登录后将端口1201的信息发送过去,并判断是否已经登录),定时向客户端发送心跳包,每隔10s发送一次,如果5次没有心跳回复,则认为掉线。
(2)客户端建立m_ClientSock和m_UdpSock两个套接句柄,m_ClientSock连接方式为TCP,m_UdpSock连接方式为UDP,端口都是随机获取的。
m_ClientSock和OnNetEvent函数建立异步通信。
m_UdpSock和OnOrgMsg函数建立异步通信。
客户端首先使用m_ClientSock建立连接,连接服务器的IP地址和端口。
首先发送PT_LOGINREQUEST和本机UDP端口(m_nUdpPort)到服务器,如果用户名和密码正确,则得到PT_LOGINACCEPT和1201端口,此时服务器会向每个客户端发送刚登录客户端的IP地址和UDP端口(PT_USERINFO)。
客户端接收到PT_LOGINACCEPT后,创建m_OrgSock套接字,本地端口随机,连接到服务器端的1201端口,准备获取org.xml文件。
客户端发送消息首先会创建taskSock套接字(客户端为A),因为用户在双击要发送消息的用户时(OnDblclkOrgtree),会获得它的UDP端口和IP地址,然后发送PT_REQUESTUDPPORT到客户端B,B新生成的UDP连接端口号后,返回PT_RETURNUDPPORT消息给A。
每次创建taskSock套接字都会启动一个接收数据的线程(SendTaskProc),此时客户端A和B都启动了接收数据的线程。
A接收到PT_RETURNUDPPORT后,返回PT_STREAM及相应的数据。
发送文件和发送消息流程相同,创建taskSock套接字后启动的是SendFile进程,A接收到PT_RETURNUDPPORT后,返回PT_FILE。
3.4开发环境
企业QQ通信系统的开发环境如下:
系统开发平台:
VisualC++6.0。
系统开发语言:
C++。
数据库管理系统软件:
Access2003。
运行平台:
WindowsXP(SP2)/Windows2000(SP4)/WindowsServer2003(SP1)。
分辨率:
最佳效果1024×768像素。
3.5数据库设计
服务器端使用Access2003作为后台数据库,用来储存组织结构及账户信息,数据库命名为SvrInfo,其中包含2张数据表。
tb_Account表:
tb_Account表储存的是账户信息。
账户信息如表3.1所示。
表3.1账户信息表
字段名
数据
类型
长度
描述
字段名
数据
类型
长度
描述
AccountID
数字
4
账户
HeaderShip
文本
20
职务
Username
文本
12
姓名
OfficePhone
文本
22
办公电话
Password
文本
18
密码
Handset
文本
22
手机
Sex
文本
2
性别
E-mail
文本
32
电子邮件
Age
数字
4
年龄
Address
文本
50
联系地址
OrgID
数字
4
部门
Picture
文本
20
图片,以账户命名
OrgName
文本
50
部门
名称
tb_OrgInfo表:
tb_OrgInfo表用于储存组织信息。
组织信息如表3.2所示。
表3.2组织信息表
字段名
数据类型
长度
描述
OrgID
数字
4
组织编号
OrgName
文本
20
组织姓名
ParentID
数字
4
上一级编号
4服务器端设计
4.1服务器端主窗体模块
4.1.1服务器端主窗体概述
服务器端可以对组织结构及账户进行管理,并且提供通信服务,负责将组织结构信息和账户信息发送给各个客户端、提供通信服务,负责将组织结构信息和账户信息发送给各个客户端、验证账户的登录权限、检查客户端是否保持在线。
客户端主窗体模块主要负责通信服务,并且可以调用组织信息管理模块和账户信息管理模块。
服务器端主界面效果如图4.1所示。
图4.1服务器端主界面
4.1.2窗口设计
创建一个对话框,向对话框中添加两个按钮控件。
设置控件属性如表4.1所示。
表4.1控件属性
控件
类型
资源值
对应类成员
名称
属性
设置
Button
IDC_ORGMANAGE
OnOrgmanage
组织信息管理
默认
Button
IDC_ACCOUNTMANAGE
OnAccountManage
账户信息管理
默认
4.1.3关键代码分析
在对话框初始化函数中,对数据库进行初始化,创建套接字并绑定本机IP地址和一个端口,然后开始监听,并将网络设置为异步通信。
为什么要使用异步通信?
异步通信有什么好处?
可以通过OnInitDialog()函数的应用来了解。
部分代码如下:
BOOLCQQServerDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
……
//监听套接字
listen(m_SvrSock,5);
listen(m_OrgSock,5);
WSAAsyncSelect(m_SvrSock,m_hWnd,WM_NETMSG,FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT);
WSAAsyncSelect(m_OrgSock,m_hWnd,WM_ORGMSG,FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT);
//设置异步IO模式
unsignedlongulValue=0;
ioctlsocket(m_OrgSock,FIONBIO,&ulValue);
SetTimer(1,10000,NULL);//开始一个计时器,每隔10s向客户端发送心跳包
SetTimer(2,10000,NULL);//判断客户端是否掉线
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
OnNetEvent()函数对应一个消息,当应用程序接收到消息后调用该函数执行。
使用WSAAsyncSelect函数可以设置事件类型。
例如,FD_ACCEPT类型是当客户端发送连接请求时服务器端如何进行应答的类型,FD_READ是读取客户端发送过来的数据事件,FD_CLOSE关闭连接事件。
LRESULTCQQServerDlg:
:
OnNetEvent(WPARAMwParam,LPARAMlParam)
{
WORDnEvent=WSAGETSELECTEVENT(lParam);//获取网络事件
WORDnError=WSAGETSELECTERROR(lParam);//获取错误代码
switch(nEvent)
{
caseFD_ACCEPT:
//有客户端发出连接请求,接受连接
{
sockaddr_inAddr;
Addr.sin_family=AF_INET;
intnAddrSize=sizeof(sockaddr_in);
//接受客户端连接
CClient*client=newCClient();
client->m_Sock=accept(m_SvrSock,(sockaddr*)&Addr,&nAddrSize);
if(client->m_Sock==INVALID_SOCKET)//接受连接失败
{
……
catch(...)//修改密码失败
{
CPackagePackage;
Package.m_Type=PT_PT_UPDATEPASSFAILD;
send(wParam,(char*)&Package,sizeof(CPackage),0);
}
}
delete[]pBuffer;
break;
}
}
returnS_OK;
}
服务器端创建两个端口,并使用TCP进行数据传输,TCP是传输控制协议,是一种提供可靠数据传输的通信协议。
它在网际协议模块和TCP模块之间的传输,该协议允许两个应用程序建立一个连接,并在全双工方向上发送数据,然后终止连接,每一个TCP连接可靠地建立并完善地终止,在终止发生前,所有数据都会被可靠地传输。
TCP通过3次握手建立可靠的连接,所谓3次握手指通信双方彼此交换3次信息。
3次握手是在存在数据报丢失、重复和延迟的情况下,确保通信双方信息交换确定性的充分必要条件。
使用TCP协议建立通信的步骤如图4.2所示。
图4.2TCP通信连接过程
在应用程序是指定时器用来做什么,从OnTimer的实现代码中可以看出。
判断用户是否在线需要使用定时器,每隔一段时间就向客户端发送一个消息,如果客户端能够回复消息,说明客户端在线,否则认为客户端已经掉线。
将服务器端发送给客户端的这条信息称为心跳包,消息类型PT_TEST就代表该包是心跳包。
服务器端保存有在线客户的列表,如果客户端掉线了,就在列表中将客户端删除。
voidCQQServerDlg:
:
OnTimer(UINTnIDEvent)
{
switch(nIDEvent)
{
case1:
//向客户端发送心跳包
{
POSITIONpos=m_ClientSockList.GetHeadPosition();
……
m_ClientSockList.GetNext(pos);
}
break;
}
}
CDialog:
:
OnTimer(nIDEvent);
验证用户名和密码,通过SQL语句检查数据库中是否有相应的用户名和密码。
BOOLCQQServerDlg:
:
VerifyUser(intnID,char*szPassword)
{
CStringszSQL;
szSQL.Format("selectAccountIDfromtb_AccountwhereAccountID=%dandPassword='%s'",nID,szPassword);
_RecordsetPtrpRecord=m_DataManage.m_pConnect->Execute((_bstr_t)szSQL,0,adCmdText);
if(!
pRecord->ADOEOF)//判断用户是否存在
{
returnTRUE;
}
returnFALSE;
}
OnOrgMsg函数同OnNetEvent函数一样,都是消息的处理函数,同样可以处理FD_ACCEPT事件。
在OnOrgMsg函数中当有客户端发送请求时,服务器端会将org.xml文件发送到客户端,org.xml文件中存放的是组织结构信息,也就是含有在线用户列表,每个客户端都会在登录时获得该列表。
如果组织结构和用户比较多时,文件会比较大,所以如果文件超出一定范围后,就将文件分成多份进行发送。
LRESULTCQQServerDlg:
:
OnOrgMsg(WPARAMwParam,LPARAMlParam)
{
WORDnEvent=WSAGETSELECTEVENT(lParam);//获取网络事件
WORDnError=WSAGETSELECTERROR(lParam);//获取错误代码
……
DWORDdwRead=file.ReadHuge(pTmp,dwMsg-sizeof(CPackage));
intnlen=send(sock,pData,dwMsg,0);
……
closesocket(sock);
//delete[]pBuffer;
}
break;
}}
returnS_OK;
}
UserIsLogined()函数主要用来判断客户端是否已经在线了,和FindClient函数类似,同样需要遍历整个列表,同样如果列表中有相同的IP和ID,说明客户端存在,否则客户端不存在。
BOOLCQQServerDlg:
:
UserIsLogined(intnID,SOCKETsock)
{
//获取套接字IP
sockaddr_inA