即时通讯软件
李宁
(浙江海洋学院 数理与信息学院,浙江舟山 316004)
摘 要
关于即时通讯系统(Instant Messaging System)的研究目前是互联网中一个热门方向,尤其是关于企业级的即时通讯系统更为国内外应用的热点。企业版的即时通讯软件的诞生,给企业的管理带来了新的思路和手段。推动了企业工作效率的提高,办公费用的降低,引起了工程应用领域的研究热潮。
即时通信中最基本的功能就是通过计算机之间的文本数据的互换的形式实现思想的交流和沟通,它的优点是方便快捷,为人们之间创建了一种新型的、廉价的、快速的、简便的沟通方式。目前即时通讯系统不仅是娱乐聊天工具,更是影响着局域网内部的管理及其交流方式。
局域网即时通讯系统为企业员工之间的交流又提供了一个新的手段,它是一个可以自定义的网络信息传递软件,能即时发送信息。
本即时通讯软件系统采用了客户机/服务器(C/S)模式,软件的主体开发环境选择的是Visual Basic 6.0(SP6),搭配的是ADO技术调用Access数据库。
关键词:即时通讯软件系统 服务器 客户端 局域网 ADO技术 Visual Basic
Instant Messaging Software
Ning Li
(School of mathematics, physics and information, Zhejiang Ocean University 316004)
Abstract
The research about the Instant Messaging System is a hot direction of the internet industry at present, it is especially a focus studied both at home and abroad even more about the instant messaging system of enterprise customer. The birth of the instant messaging software of the enterprise edition has brought the new thoughts and means to management of enterprises. Having promoted the improvement of enterprise's working efficiency, the reducing of the official bossiness cost, has caused the research upsurge of the project application.
The most fundamental function of IM is the data exchange between the computer. IM's merit is to rapid , to have established one kind between conduct conveniently to link way up late-model , low-priced , speedy , simple and convenient. At present,IM is an entertainment chat implement not only , also is the internal administration being affecting a local area network and their exchange way.
LAN IM has provided a new means to the exchange between enterprise employee. One can receive and send imformation immediately.
The instant messaging system has adopted the client/server (C/S) mode. The software exploitation environment is Visual Basic 6.0(SP6).The data base mode is Access.
Key words:Instant Messaging System Server Client Local Area Network(LAN) ADO Visual Basic
目录
摘 要 ................................................................................................................................. I Abstract ............................................................................................................................. II
1概述 ............................................................................................................................... 1
1.1即时通讯软件的发展历程 .............................................................................. 1
1.2 国内外即时通讯研究的现状 ......................................................................... 1
1.3 本文的研究内容和意义 ................................................................................. 2
2系统设计与选型 ........................................................................................................... 3
2.1了解用户需求 .................................................................................................. 3
2.2软件工具的选型 .............................................................................................. 4
2.3服务器模块的功能分析 .................................................................................. 4
2.4客户端模块的功能分析 .................................................................................. 4
3数据环境的设计 ........................................................................................................... 6
3.1服务器端Users.mdb的结构 .......................................................................... 6
3.2客户端Data.Mdb的结构 ................................................................................ 7
3.3客户端Users.ini的结构 .............................................................................. 7
4网络协议的设计 ........................................................................................................... 8
4.1网络协议概述 .................................................................................................. 8
4.2网络协议的设计 .............................................................................................. 8
5服务器模块的创建 ..................................................................................................... 10
5.1服务器端的主窗体frmServer ..................................................................... 10
5.2服务器的初始化 ............................................................................................. 11
5.3接受客户端的连接 ........................................................................................ 12
5.4服务器与客户端的数据交互 ........................................................................ 12
5.5客户端断开连接 ............................................................................................ 13
5.6服务器断开同客户端的连接 ........................................................................ 13
6客户端功能模块的创建 ............................................................................................. 14
6.1创建主模块MainModule ............................................................................... 14
6.2“登陆”窗体frmStep1 ................................................................................ 14
6.3“注册向导1”窗体frmStep2 ..................................................................... 15
6.4“注册向导2”窗体frmInformation ......................................................... 15
6.5“客户端”主体窗frmClient ...................................................................... 17
6.6内存索引模块MemoryTree ........................................................................... 23
6.7消息发送窗体frmChat ................................................................................. 24
6.8新消息处理窗体frmNewMessage ................................................................. 25
6.9“历史消息”窗体frmHistory .................................................................... 26
7总结 ............................................................................................................................. 28
参考文献 ........................................................................................................................ 29
1概述
这是一个信息高度膨胀的时代,网络已经融入我们的生活,它改变着我们的生活,也改变着我们的交流方式。新世纪的人才是善于交流的人才,而网络即提供了一个很好的交流平台。网络上的交流方式有很多种,包括电子邮件、聊天室、论坛、博客与即时通讯软件(如QQ,MSN)等。其中即时通讯软件(Instant Messaging)是发源较早并有持续生命力的一种,尤其是在近几年,即时通讯软件已在世界范围内蓬勃发展到一个新的高度。
即时通讯软件系统利用服务器上的用户注册信息和联机用户建立起虚拟社区;服务器为社区成员提供状态信息和联系方式,以便用户之间互相通讯;用户使用特定的即时通讯客户端登录到服务器,找到用户想联系的人进行交流。
1.1即时通讯软件的发展历程
1996年11月,以色列Mirablils公司推出了世界上第一个即时通讯软件,即后来风靡全球的“网络寻呼机ICQ"。这就宣告了“即时通讯”这一概念的诞生,并导致了后来即时通讯软件的滥觞。
在ICQ取得巨大成功之后,许多公司纷纷效仿,如美国AOL公司的Instant Messenger,Yahoo公司的Yahoo Messenger等。有调查资料甚至列出了国外多达18种的即时通讯软件
[5][3][4][2][1]。在我国,深圳腾讯公司1999年2月推出了腾讯QQ。目前国内数十家公司拥有自主知识短短几年间,即时通讯软件系统迅猛发展:商业产品层出不穷,用户遍布世界各地,技[6]产权的即时通讯产品。 术日新月异。
1.2 国内外即时通讯研究的现状
从商业研究的方面看,即时通讯软件从最初的免费政策,到逐渐挖掘和整合创新多种盈利模式,即时通讯市场收入逐步扩大,而为企业用户提供商务即时通讯的一整套解决办法将成为未来即时通讯企业角逐的热点和盈利的新空间。
即时通讯运营商的盈利模式包括互联网增值服务、无线网增值服务、广告服务和企业即时通讯服务。以前,即时通讯运营商的盈利方式还仅局限于互联网即时通讯增值业务,但是随着市场的发展和功能的开发,无线网络增值业务和广告业务更多的参与到运营商整体收入中来。
从学术化的即时通讯研究方面看,国内外公开发表的论文非常少。仅有的几篇集中在即时通讯基本服务元素的定义方面
关于安全性的讨论[12][10][9][8][7]与即时通讯软件技术实现、编程技巧等方面[11]。还有部分。
总的说来,国内外关于即时通讯的研究还不够系统和深入。
1.3 本文的研究内容和意义
关于即时通讯软件系统(Instant Messaging System)的研究目前是互联网中一个热门方向,尤其是关于企业级的即时通讯系统更为国内外应用的热点。企业版的即时通讯软件的诞生,给企业的管理带来了新的思路和手段,推动了企业工作效率的提高,办公费用的降低,引起了工程应用领域的研究热潮[13]。
一般企业都希望尽量增进内部员工之间的交流,而且希望这种交流能够省时、方便、充分。目前,即使是传统企业,也开始使用计算机管理日常工作,更不用说现在的高科技企业了。计算机成了工作的必需装备,公司内部局域网和互联网应用已经普及,为了充分利用网络资源,公司一般提供诸如E-mail、公司内部论坛等的网络通讯手段。
局域网即时通讯系统为企业员工之间的交流又提供了一个新的手段,它是一个可以自定义的网络信息传递软件,能即时发送信息,当对方不在线时,信息也不会丢失。除了提供发送信息的功能外,还提供了用户分组、表情符号、信息提示等多种辅助功能
客户端存储等内容。 [14]。 通过该系统的开发过程,可以掌握自定义网络传输格式、网络传输数据、网络端存储、
2系统设计与选型
2.1了解用户需求
开发软件,也许源于公司的需要,也许是受人委托,无论哪种情况,充分了解用户的需求才能开发出好用的软件。
在着手工作以前,先充分了解用户的需求才能最终满足该软件用户的需求,这样才可能避免在软件开发过程中进行一而再、再而三的改动,耗时耗力,增加了成倍的工作量。 现在很多软件公司不仅自行开发商业软件,还有一个重要的业务就是“接项目”——应客户的需求开发软件。项目开发到最后阶段,软件已经成形,内部测试后就演示给客户,往往这时候麻烦来了,麻烦产生的原因一般都是在于用户的需求发生变动。
用户一开始对软件的功能往往只有初步的认定(甚至只是初步的意向),只有具体的东西真正放在面前时,他才可能会关注这些,然后指出流程不是这样的,应当还具备什么样的功能等等,或者报表的形式如何如何。
用户永远是这方面的专家。所以,在进行系统设计前一定要充分与用户交谈,了解用户的行业、行业术语、日常业务、使用习惯、查看以往的书面报表等等。尤其要注意的是如果用户以前也使用计算机管理,一定要研究以前使用的管理软件,为什么要更换,不好的地方在哪方面,需要保留的好的方面是什么,这样才能在系统设计时尽可能提供详细的设计说明书[15]。
由于用户需求很可能产生变动,所以增量迭代(incremental and iterative)的方法确实值得推广,但是这又涉及到一个组织成熟度的问题,因为由此会提高对Architect的能力要求,而且需求管理和测试更加要求严格。
而商业性质的软件,更是要充分调查潜在消费者的需求,然后确定软件的功能和风格等等,错误的市场定位必然导致软件产品的失败。由此可见,了解用户需求是多么重要。 具体到局域网即时通讯系统,用户的基本需求如下。
(1) 用户登录功能:只有注册过的用户才能使用该软件发送和接受信息。
(2) 新用户注册功能:注册新用户。
(3) 能够添加好友,并显示在好友名单中,
(4) 能够在好友名单中选择一个好友,给好友即时发送信息;
(5) 发送的信息中可以带有表情符号。
(6) 当好友不在线时信息存储在服务器,也就是可以给其留言。
(7) 当收到信息时要求有提示,避免错过及时查看信息。
(8) 能够存储历史信息,一边查看以前的信息。
(9) 能够将某些人添加到黑名单,能自动屏蔽黑名单中的人发送来的信息,避免被骚扰
[16]。
因为功能集中,所以看起来很简单。即使如此,由于绝大多数项目没有足够的时间或资源实现每个功能,所以需要决定哪些特性是必要的,哪些是重要的,这些是需求开发的主要部分。只能由客户负责设定需求优先级,因为开发者不可能按照客户的观点决定需求优先级。
尽管没有人愿意看到自己所希望的需求在项目中未被实现,但毕竟是要面对现实,业务决策有时不得不依据优先级来缩小项目范围,或在质量上寻求折中[17]。
从局域网即时通讯系统来看,最重要的需求一般是第1、2、4项。
2.2软件工具的选型
首先,考虑可能的解决方案。例如,使用何种开发工具,信息存储使用传统的文件系统还是数据库,使用何种方式进行网络通信。通常至少应该考虑下述几类可能的方案。
(1) 低成本的解决方案:系统只能完成最必要的工作,不能多做一点额外的工作。
(2) 中等成本的解决方案:这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。
(3) 高成本的“十全十美”的系统:这样的系统具有用户可能希望有的所有功能和特点。 在充分权衡各种方案的利弊的基础上,选择一个较好的系统(最佳方案)。本即时通讯软件的主体开发环境选择的是Visual Basic 6.0(SP6),搭配的是ADO技术调用Access数据库,选择的理由如下。
(1) 本软件的技术难度不是很大,但是需要实现的细节功能比较多,所以选择一个相对比较容易使用的开发工具有利于将注意力集中在软件的功能本身,而不是开发工具的使用,所以选择Visual Basic 6.0(SP6)中文版作为开发环境。
(2) 在服务器端需要利用数据库记录用户的留言信息,在客户端需要利用数据库记录用户接受到的新消息和历史消息。这些数据不会构成很大的数据量,所以不需要采用MS SQL Server等大中型数据库,而采用ADO控件可以非常方便调用的Access数据库。
另外,到微软的网站上给Visual Basic安装补丁SP6后,使得本软件的开发工作节省了不少力气,否则ImageCombo控件都不能使用。
2.3服务器模块的功能分析
局域网即时通讯系统的功能分为两大类——客户端功能和服务器端功能。
服务器端功能1:监测用户状态。在服务器端,不但可以看到所有用户的注册信息,还可以实时地看到用户的在线状态。
服务器端功能2:显示用户留言。如果某个用户给另外一个不在线的用户发消息,那么就会在服务器端作为留言记录下该条信息。
(1)主界面中显示所用户的注册消息
(2)主界面中显示所有用户的在线状态
(3)显示所有的留言消息
(4)随时修改用户的注册信息
(5)随时修改留言信息
2.4客户端模块的功能分析
(1)在状态栏的状态栏区上显示图标。
(2)在主界面中通过菜单调用新消息处理界面。
(3)在主界面中通过菜单调用历史消息处理界面。
(4)通过状态栏图标可以调用菜单,并且以动画形式醒目地提示用户收到了新消息。
(5)用ADO控件读写包含rtf文档的数据库。
(6)给在线用户发送即时消息。
(7)给不在线用户发送留言消息。
(8)消息中可以包括图标和文本。
(9)可以设置消息文本的颜色和字体。
(10)为联系人分组。
(11)屏蔽黑名单的信息。
3数据环境的设计
首先分析本系统所需要存储的数据。在服务器端,需要存储用户的信息,以进行用户登录,注册新用户,为用户之间的交流提供平台。
由于服务器端需要接受客户端发送来的信息,并根据自定义的网络协议解析信息的含义,做出相应的处理,例如,将接受到的消息发送给指定用户,所以还需要存储服务器工作记录。 本系统需要设计Access的数据库,存储在服务器端应用程序路径下面,服务器端的文件名为Users.mdb。
在客户端,需要存储接收到的新消息和看过后保存起来的消息。在客户端应用程序路径下面存储一个文件,文件名为Data.mdb。另外还需要为客户端设计一个ini文件,文件保存在客户端应用程序路径下面,用来记录好友名单和黑名单,文件名为Users.ini。
3.1服务器端Users.mdb的结构
首先用Access创建数据库Users.mdb,并且为该数据库添加一个表UsersInformationg,在UsersInformationg表中有六个字段,见表3-1
其中UserID字段用于存储用户ID,Password字段用于存储用户密码,NickName字段用于存储用户的昵称,Mail字段用于存储用户的邮箱地址,Status用户存储用户的在线状态(0为离线,1为在线),UserFace用于存储用户选择的头像索引。
表
然后再为该数据库添加一个表Messages,在Messages表中有4个字段,见表3-2
其中ReceivedID字段用于存储发送消息的用户ID,sentID字段用于存储接受消息的用户ID,Content字段用于存储消息内容,time字段用于存储服务器接受到消息的时间。 经验总结:Content字段设置为备注类型,就可以存储图文混排的消息内容了。
3.2客户端Data.Mdb的结构
Data.mdb仅仅用于在客户端。
首先用Access创建数据库Data.mdb,并且为该数据库添加两个表NewMessages和
HistoryMessages,在NewMessages和HistoryMessages表中都有4个字段,并且它们的字段设置相同,见表3-1。
表
其中ReceivedID字段用于存储发送消息的用户ID,SentID字段用于存储接收消息的用户ID,Content字段用于存储消息内容,Time字段用于存储服务器接收到消息的日期/时间。
3.3客户端Users.ini的结构
Users.ini文件仅仅用于客户端记录联系人的信息,它是一个文本文件,典型的文件内容如下:
[1001_Friends]
Count=2
[1001_Friends_Item0]
UserID=1000
UserNickName=1000
UserMail=0
UserFace=4
[1001_Friends_Item1]
UserID=1002
UserNickName=haha
UserMail=h
UserFace=5
举例来说:[1001_Friends]下面代表用户ID为1001的总体好友信息,Count记录了好友的数目。
[1001_Friends_Item0]下面存储了用户ID为1001的第1个好友的信息,如好友ID、好友昵称、好友邮箱以及好友的头像索引。
[1001_Badboys]下面代表用户ID为1001的总体黑名单信息,Count记录了黑名单的数目。
[1001_Badboys_Item0]下面存储了用户ID为1001的第1个黑名单的信息,如黑名单ID、黑名单昵称、黑名单邮箱以及黑名单的头像索引。 [1001_Badboys] Count=1 [1001_Badboys_Item0] UserID=1001 UserNickName=1001 UserMail=1 UserFace=6
4网络协议的设计
4.1网络协议概述
即时通讯软件系统组织起了分布在互联网各个角落的用户虚拟社区,具有典型的分布式客户端/服务器结构—服务器端提供即时消息服务,客户端是用户代理,它们之间通过一定的协议来交互。
协议是服务的正式描述,它详细规定了参与合作的各方进行交互的语法、语义和时序细节[18]。
4.2网络协议的设计
本系统中服务器软件、客户端软件之间的协作完全依赖网络通信,通信信息采用ASCII码明文传送,这样对不同类型的数据采用了统一的方式。
每帧信息总体格式定义如图4.1,命令号固定占有3个字符的空间,命令内容的具体格式与命令有关。
图4-1 每帧信息总体格式定义
以下列举几组具体命令格式。
图4-2申请新用户的命令
图4-3信息处理的命令
图4-4设置好友的命令
图4-5与登陆相关的命令
图4-6设置黑名单的命令
图4-7获取消息的命令
图4-8发送消息的命令
5服务器模块的创建
5.1服务器端的主窗体frmServer
新建一个工程,将工程的名称设置为"服务器",工程的文件名为prjNetChatServer.vbp,为该工程添加一个窗体frmServer.
向服务器端主窗体frmServer上添加两个Frame控件(Name属性分别为
fraUsers,fraMessages),两个DataGrid控件(Name属性分别为dgdUsers,sgsMessages),两个Adodc控件(Name属性分别为adoUsers,adoMessages),一个RichTextBox控件(Name属性为trfMessage),一个Winsock控件(Name属性为wskServer)和一个Timer控件(Name属性为tmrOnline).
设计完成的服务器端的主窗体如图5-1所示。
图5-1设计完成的主界
各控件的主要属性设置如下.
(1)dgdUsers控件的DataSource属性设置为adoUsers
(2)dgdMessages控件的DataSource属性设置为adoMessage.
(3)rtfMessage控件的DataSource属性设置为adoMessage,DataField属性设置为Content.
各控件的作用如下.
(1) fraUsers控件提供了一个框架容器,它包含dgdUsers和adoUsers控件.
(2)adoUsers控件用来读取UsersInformation表内容.
(3)dgdUsers的DataSource属性设置为adoUsers,它用来显示adoUsers控件读取到的内容,也就是UsersInformation表的内容.
(4)fraMessages控件提供了一个框架容器,它包含adoMessages,dgdMessages控件和rtfMessage控件.
(5)adoMessages控件用来读取Users.mdb数据库中Messages表的内容.
(6)dgdMessages的DataSource属性设置为adoMessages,用它来列表显示adoMessages控件读取到的内容,也就是Messages表的内容.
(7)rtfMessage控件:显示在dgdMessages控件中选中行(留言)的具体内容.
5.2服务器的初始化
在服务器工作过程中,首先执行From_Load过程,设置adoMessages,adoUsers控件的属性,使得它们分别读取Users.mdb数据库中Messages,UsersInformation表的记录. 读取Users.mdb数据库中Messages表的记录:
Me.adoMessages.ConnectionString = & _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & APP_PATH & "Users.mdb"
http://mandType = adCmdTable
Me.adoMessages.RecordSource = "Messages"
Me.adoMessages.Refresh
同样方法读取Users.mdb数据库中UsersInformation表的记录:
adoMessages、adoUsers都为Adodc控件,其ConnectionString属性设置要连接的数据源(数据库),需要提供数据源的类型、存储路径和名称等。
对于Access 2000数据库,Provider应为Microsoft.Jet.OLEDB.4.0。
Data Source设置为" & APP_PATH & "Users.mdb"则数据库的存储路径为当前应用程序目录,数据库文件名称为User.mdb。
adoMessages控件的RecordSource属性设置为Messages,则说明adoMessages控件的记录源为User.mdb数据库中的Messages表。
服务器初始化的时候,还需要对窗体上的wskServer控件进行初始化。该控件的Index属性设置为0,这也就是说wskServer实际上是一个控件数组,通过以下语句设置wskServer数组中第1个控件元素的属性,并且处于Listen状态,等待客户端的连接。
同时设置LinkCount全局变量的数目为0,它表示已经成功连接到服务器的客户端的数目:LinkCount = 0
由于在服务器开始运行阶段,不可能有客户端进行连接操作,所以设置所有用户为离线状态。
5.3接受客户端的连接
如果有客户端连接到服务器,那么就会激活wskServer的wskServer_ConnectionRequest事件过程。
程序首先将连接到服务器的客户端的数目加1,然后通过Load方法为wskServer控件数组添加一个新的Winsock控件元素,并且通过wskServer(LinkCount).Accept requestID语句设置这个新控件元素专门对应这个客户端的连接。
5.4服务器与客户端的数据交互
服务器与客户端的数据交互是frmServer窗体编程的重点,也是本软件的重点之一,服务器端接收到客户端数据后,处理的流程如下。
(1)接收客户端发送的数据并存储在strReceived变量中。
(2)从strReceived变量中分析出客户端发送的命令号和命令内容,分别存储在变量intCommandID和strCommandContent中。
(3)根据intCommandID变量的值,按照不同的规则分析命令内容,并且做出响应。 下面介绍实现服务器与客户端数据交互的主要代码。如果服务器接收到数据,就会激活wskServer_DataArrival过程,首先通过以下语句接收客户端发送的数据并存储在strReceived变量中:wskServer(Index).GetData strReceived
strReceived变量分析出客户端发送的命令号和命令内容,分别存储在变量intCommandID和strCommandContent中。
由于命令号占3个字节,所以使用Left(strReceived, 3)获得strReceived变量的前3个字符即可取得命令号,再使用Val将取得的命令号由字符转换为数字。
然后根据不同的命令号,按照不同的规则分析命令内容,并且做出响应。
对于服务器与客户端进行交互的处理过程已经很清楚了,现在就以对注册新用户的命令为例,介绍处理数据的流程。
申请一个新用户的命令号为001,命令内容为“用户昵称;用户密码;用户的电子邮箱地址”,所以,当命令号为001时,首先获取用户昵称并存储。
首先定义变量strNickName用来存储用户昵称,然后获取命令内容中“;”符号第1次出现的位置,根据“;”符号第1次出现的位置就可以确定用户昵称在命令内容中的位置,从而获得用户昵称并保存在strNickName变量中。
获取用户密码的代码如下:
~从命令内容中去掉用户昵称部分仍然存储在strCommandContent变量中
strCommandContent = Mid(strCommandContent, intPos + 1)
~获取用户密码
Dim strPassword As String
intPos = InStr(1, strCommandContent, ";", vbBinaryCompare)
strPassword = Left(strCommandContent, intPos - 1)
在代码中,首先从命令内容中去掉用户昵称部分存储在strCommandContent变量中,此时strCommandContent变量中存储的命令内容为“用户密码;用户的电子邮箱地址”,然后使用与获得用户昵称同样的方法,就可以获得用户密码并存储在strPassword变量中。 取得新用户的详细信息后,为新用户的UserID字段准备值:
Dim intUserID As Integer
intUserID = 1000 + Me.adoUsers.Recordset.RecordCount
添加新用户,保存并更新:
Me.adoUsers.Recordset.Save
Me.adoUsers.Recordset.Update
发送申请新用户成功的消息给客户端:
wskServer(Index).SendData "002:" & CStr(intUserID)
5.5客户端断开连接
如果客户端断开与服务器的连接,那就会激活wskServer的wskServer_Close事件过程。 程序首先向数据库中写入客户的状态信息——设置Status字段的值为0,然后通过Unload方法从wskServer控件数组中删除关闭的Winsock控件。
5.6服务器断开同客户端的连接
当服务器停止运行时,就会主动断开所有与客户端的连接。