基于VB的QQ聊天.docx
《基于VB的QQ聊天.docx》由会员分享,可在线阅读,更多相关《基于VB的QQ聊天.docx(36页珍藏版)》请在冰豆网上搜索。
基于VB的QQ聊天
摘要
随着现代社会的不断进步,信息传递和信息交流越来越受到人们的重视。
在古代,通过飞鸽传书,通过烽火报警,通过快马传递上级命令等到近代的电报可快速明确的传递信息,在到当代使用电话,email,电脑,传真等,其中在国内人们比较喜欢用的聊天工具就是QQ聊天工具,它可以在网上实施即时通信,传输文件和图片并且进行语音或者视频聊天等等,方便人们进行情感交流、业务洽谈、多方会议,可以足不出户就能达到自己的目的。
既然QQ工具有这么多好处,那么它是怎么实现的呢?
本设计的目的就是在Vb编程平台上,使用Winsock控件实现客户端与服务器端的通信。
由于受技术和知识的限制本设计仅能实现基本的单人聊天和多人聊天及添加好友功能。
关键词:
VB6.0,QQ聊天系统,Winsock
目录
第一章设计的概述1
1.1设计的目的1
1.2设计的意义1
第二章系统的设计2
2.1模块设计2
2.2开发环境3
2.3系统的整体流程3
2.4数据库设计3
第三章winsock基础5
3.1Winsock控件基础5
3.2Winsock控件的属性6
3.3Winsock控件的方法7
3.4Winsock控件事件8
第四章CtListBar和TUOPAN控件10
4.1Ctlistbar和TUOPAN控件的使用10
4.2CtListBar的方法10
4.3CtListBar的属性10
4.4TUOPAN控件的介绍11
第五章程序设置12
5.1用户的登陆12
5.2注册17
5.3添加好友19
5.4单人聊天21
5.5多人聊天23
第六章系统的调试与运行26
6.1系统的调试26
6.2系统的运行27
第七章课题设计总结与工作展望32
7.1课题设计总结32
7.2工作展望32
参考文献33
第一章设计的概述
1.1设计的目的
为了跟进时代,实现通过网络连接来实现聊天和文件传输以及语音、视频通话等,本设计目前仅以实现基本的聊天功能和添加好友功能为设计目的,来实现现代流行的网络聊天工具的一小部分,本设计程序界面类似于QQ的好友界面,通过VB6.0并结合数据库来实现这些基本的聊天功能。
1.2设计的意义
随着现代社会的不断进步,信息传递和信息交流越来越受到人们的重视。
在古代,通过飞鸽传书,通过烽火报警,通过快马传递上级命令等到近代的电报可快速明确的传递信息,在到当代使用电话,email,电脑,传真等,其中在国内人们比较喜欢用的聊天工具就是QQ聊天工具,它可以在网上实施即时通信,传输文件和图片并且进行语音或者视频聊天等等,方便人们进行情感交流、业务洽谈、多方会议,可以足不出户就能达到自己的目的。
为了跟得上时代,能与社会接轨。
此聊天工具实现了基本的聊天功能,并且能够添加好友,还能实现群聊和私聊的功能,当然这与现在流行的网络聊天工具相比仅仅是一个非常不完善的程序,还不能够满足当代人的需求,本实验小组希望在以后的工作和学习中能够不断的去完善这个程序,做到让大家都能够接受并且认可这个聊天工具。
第二章系统的设计
2.1模块设计
本系统中的Winsock控件采用TCP连接协议进行连接。
根据需要系统分为:
1.服务器端模块;2.客户端模块。
1.服务器端模块
此模块主要起到了一个中转的作用,将一个客户端的信息发到指定的另一个客户端。
此模块中共有三个winsock数组,分别实现不同的功能:
(1)第一个winsock它可以在用户登陆的时候验证用户是否存在,若不存在,要进行注册,客户将注册信息提交到服务器端,服务器为用户分配一个用户号,再将用户号插入到information信息表中,提示用户注册成功。
(2)用户登陆成功后,第二个winsock开始实现其功能,即客户对这一winsock发出连接请求,记录客户的远程IP和端口号和分配给客户端的winsock的索引值,并显示在服务器端的列表中,在online表中插入记录包含分配给客户端的winsock的索引值、用户号、客户的远程IP和端口号,以明确谁在线上,给在线好友发送在线信息,给该客户发送好友信息、检查是否有人加自己为好友、处理客户端对加好友的响应,若答应其请求则将双方用户号插入到friend表的记录中,此外,它还处理着该设计最主要的功能,即单聊和多聊功能。
(3)第三个winsock起作用是在用户想要查询好友和加好友时,检查要加好友是否已经加过,或是否已经要求加过,或者加的是否是自己。
2.客户端模块
客户端模块分为登陆模块、QQ主模块、单人聊天模块、多人聊天模块、添加好友模块。
登陆模块:
实现用户的登陆和注册功能,用户输入正确的用户名和密码方能进入主界面。
(1)QQ主界面模块:
可以看到好友的在线状态,可以连接到单人聊天界面、多人聊天界面和添加好友界面。
(2)单人聊天界面:
用户双击QQ主界面的列表好友项可进入此界面,可点击发送按钮发送信息给个人或用快捷键发送。
(3)多人聊天模块:
所有人发布的信息都将显示在聊天记录中。
(4)添加好友模块:
用户可查询要加好友的用户名、昵称、地址,可以将查询的用户添加为好友,若好友是自己或已加好友,则会给出错误提示。
2.2开发环境
结合所要开发的系统的特点,系统将使用VisualBasic6.0中文版来作为开发工具,后台数据库则用Access2000。
2.3系统的整体流程
图2-1系统整体流程
2.4数据库设计
本系统将使用Access作为数据库管理系统(DtataBaseManagementSystem,DBMS)。
在Access中,新建一个数据库,将其命名为db1.mdb。
(1).登录表如表2-1
表2-1登录表
字段名称
数据类型
说明
备注
User_ID
自动编号
用户ID
关键字段
User_psw
文本
用户登录密码
不能为空
(2).用户信息表如表2-2
表2-2用户信息表
字段名称
数据类型
说明
备注
User_ID
文本
用户ID
关键字段
User_name
文本
真实名字
不能为空
User_addr
文本
用户地址
不能为空
Nicheng
文本
用户昵称
(3).在线人数表如表2-3
表2-3在线人数表
字段名称
数据类型
说明
备注
Num
数字
用户使用的winsock的索引
不能为空
People_id
文本
登录表中的用户id
不能为空
People_ip
文本
用户使用的ip
不能为空
People_port
文本
用户占用的端口号
不能为空
(4).好友关系对应表如表2-4
表2-4好友关系对应表
字段名称
数据类型
说明
备注
User_ID
文本
用户ID
不能为空
Friend
文本
好友用户号
不能为空
(5).好友关系对应表如表2-5
表2-5好友关系对应表
字段名称
数据类型
说明
备注
Friend_id
文本
好友用户号
不能为空
My_id
文本
用户号
不能为空
第三章winsock基础
3.1winsock控件基础
在VisualBasic网络通讯的程序设计环境中,winsock控件确实是一个非常有用的控件。
在程序设计时看不到winsock控件显示在窗体上,但是它可以提供程序设计依据。
此外,在这个控件的使用上,您可以非常容易的要求控件为您调用TCP或是UDP网络服务的功能。
而本设计就是使用了其中的一种:
TCP网络服务功能。
下面让我们来一起熟悉一下TCP协议。
一、TCP基础
TCP协议是目前比较流行的通讯协议。
它的全名为“传输控制协议(TransferControlProtocol)”,它是一种面向连接的协议。
因此,当您使用TCP协议连接两个网络上的设备时,将可以在它们之间交换希望交换的数据。
如果开发的应用程序属于主从式应用架构,将必须知道应用系统主机的IP地址(利用RemoteHost属性取得)以及连接端口号(利用RemotePort属性取得)。
这些数据都齐全后,您才可以进一步调用、连接。
如果正在建立主机端应用程序时,必须指定本机(执行应用程序所在的计算机)所用的连接端口号(LocalPort属性),接着将Winsock控件设置为“监听(Listen)”,即可等候远程客户进行调用与连接。
当主机接收到客户端调用并且要求连接的信息时,将会触发“要求连接事件(ConnectionRequest事件)”,接着进行标准允许或拒绝的程序。
一旦主机与客户端连接完成之后,您就可以开始使用“传输数据(SendData)方法”,将数据传送给对方,并利用“传送完成(SendComplete)事件”。
此时,您可以使用“取得数据(GetData)方法”,来取得这些连接到的数据。
上述程序将周而复始的发生,直到发生“中断连接事件”或是不正常的连接为止。
则属于winsock控件TCP协议的运行特色。
二、UDP基础
UDP协议全名为“用户数据报协议”,其运行方式与TCP有所不同,一般使用UDP并没有所谓的主机端和客户端的限制。
由于UDP在本设计中并未用到,所以它的细节在此就不介绍了。
3.2winsock控件的属性
(1)属性名称:
Index(属于active控件)
功能:
在集合对象之中
语法:
对象表达式(index)
(2)属性名称:
LocalHostName
特点:
数据具有只读性,并且在设计过程中无法读取属性的内容。
语法:
对象表达式.LocalHostName
返回值:
字符串
(3)属性名称:
LocalIP
特点:
数据具有只读性,并且在设计过程中无法读取属性的内容。
语法:
对象表达式.LocalIP
返回值:
字符串
(4)属性名称:
Localport
功能:
返回或设置本机连接端口号
特点:
数据具有可读性,在设计过程中可以进行设置或读取。
当您所连接的端口号指定为“0”时,表示程序在执行过程中,将会自动取得可以使用的连接端口号。
对于客户端来说,本机连接的端口号是“将数据传送出去的端口号”。
对于主机端来说,是“监听客户端提出连接请求的连接端口号”
语法:
对象表达式.LocalPort
返回值:
长整数
(5)属性名称:
protocol(winsock控件)
功能:
返回目前使用的协议名称,或是设置即将使用的协议名称。
协议名称为“TCP”或是“UDP”两者之一。
语法:
对象名称.protocol[=protocol]。
返回值:
void。
(6)属性名称:
RemoteHost(属于ActiveX控件)
功能:
返回或设置用来传送和接收数据的远程计算机设备名称。
特点:
可以使用别名或是IP地址。
语法:
对象表达式.RemoteHost=字符串。
(7)属性名称:
RemoteHostIP
功能:
返回远程计算机设备的IP地址。
返回值:
字符串。
(8)属性名称:
RemotePort(属于ActiveX控件)
功能:
返回或是设置用连接远程主机所使用的连接端口号。
语法:
对象表达式.Remote=Port。
(9)属性名称:
State(属于Winsock控件)
功能:
返回枚举类型的控件状态值。
特点:
数据具有只读属性,并且在设计过程中无法取得属性值。
语法:
对象表达式.State。
返回值:
整数。
表3-1state关键值表
常数
值
说明
Sckclosed
0
默认值,已经关闭控件
Sckconnected
7
已经连接上
3.3Winsock控件的方法
(1)方法名称:
Accept
特点:
仅仅用于TCP主机端的应用程序。
当远程计算机要求连接时,即使用这种方法来产生一个连接专署的处理值。
与ConnectionRequest事件一起使用
语法:
对象表达式.AcceptrequestID
数据类型:
长整数
返回值:
Void
(2)方法名称:
Bind
功能:
为TCP连接指定被使用的LocalIP以及LocalPort
语法:
对象表达式.bindLocalPort,LocalIP
方法名称:
Close
特点:
关闭TCP连接或是socket监听
语法:
object.close
参数:
无
返回值:
Void
(3)方法名称:
GetData(属于Active控件)
特点:
不支持已经被命名的参数
语法:
object.GetData(format)
(4)方法名称:
GetData(属于Winsock控件)
功能:
从缓冲区里面取出数据,并且将数据储存为Variant类型的变量之中
返回值:
Void
语法:
对象表达式.GetDatadata,[type,][maxlen]
(5)方法名称:
Listen
功能:
建立一组Socket且将这组socket设置成监听模式。
特点:
这种方法仅仅使用于TCP连接中。
语法:
对象表达式.Listen。
参数:
无。
返回值:
void。
(6)方法名称:
SendData
功能:
将数据传送给远程计算机
语法:
对象表达式.SendDatadata
返回值:
void
3.4Winsock控件事件
(1)事件名称:
Close
触发:
当远程计算机关闭连接时,将会触发此事件。
因此,应用程序必须使用close方法来关闭正在连接中的TCP连接。
语法:
对象表达式_Close()
参数:
无。
(2)事件名称:
ConnectionRequest
触发:
当客户端向主机发出连接请求时,将会触发该事件。
特点:
仅仅使用在TCP连接的应用软件上面。
并且当远程计算机向主机发出连接请求时,才会触发该事件。
同时此事件被触发之后,远程计算机的RemoteHostIP以及remotePort等信息,都将会被存储到相对应的标识数据组里。
语法:
对象表达式_ConnectionRequest(requestIDasLong)
(3)事件名称:
DataArrival
触发:
当客户端发出连接请求时,将会触发此事件
语法:
对象表达式_DataArrival(bytesTotalasLong)
第四章CtListBar和TUOPAN控件
4.1Ctlistbar和TUOPAN控件的使用
(1).Ctlistbar控件的使用
在本设计中成功登陆后是通过Ctlistbar控件来实现好友的显示和好友分组的显示,在Ctlistbar控件中单击已添加好友昵称,即可出现聊天界面,同时也可以通过相关操作来实现对好友分组的删除与添加的控制,或者是删除好友等等。
(2).TUOPAN控件的使用
为了实现登陆窗口的最小化,且能在屏幕的右下角显示相对应的图标功能,因此通过VB安装包本身自带的相应的程序来生成TUOPAN控件(自己命名)
4.2CtListBar的方法
表4-1CtListBar的方法
方法
返回类型
说明
AddList
integer
添加一个新的分组
DeleteList
boolean
从控件中删除一个已有分组
AddListItem
integer
在一个分组中新添加一个项目
DeleteItem
boolean
在一个分组中删除一个项目
InsertListItem
short
在某一分组中的某一位置插入一个新的项目
ClearLists
void
清除控件中的所有分组和项目
4.3CtListBar的属性
表4-1CtListBar的属性
属性
数据类型
说明
BackImage
Picture
设置控件背景图片。
利用这个属性,可以实现“皮肤”的功能。
BarHeight
integer
设置分组按钮的高度。
BorderType
integer
设置控件的边框样式
BorderColor
long
设置控件的边框颜色,仅当BorderType设置为“0-Regular”时有效。
ButtonBackColor
long
设置分组按钮和上下滚动按钮的颜色。
ButtonForeColor
long
设置分组按钮和上下滚动按钮的字体颜色。
ButtonSize
integer
设置上下滚动按钮大小。
GradientFill
boolean
设置控件背景是否显示渐变色。
GradColorFrom
long
设置渐变色的起始颜色。
GradColorTo
long
设置渐变色的结束颜色。
IconSize
integer
设置图标显示模式是大图标或小图标。
Image1-6
Picture
设置预先在控件中加载的6幅图片。
ListBarStyle
integer
设置控件纵向或是横向显示。
ListBackColor
long
设置控件的背景颜色。
ListForeColor
long
设置分组中项目文字的颜色。
ListScrollSpeed
integer
设置项目滚动的速度。
ItemScrollSpeed
integer
设置分组滑动的速度。
4.4TUOPAN控件的介绍
1.生成TUOPAN控件的方法:
本设计使用控件法来实现托盘的效果,在VB安装盘里找到(目录为:
COMMON\TOOLS\VB\UNSUPPRT\SYSTRAY)!
在Tool文件夹里查找一个名叫Systray的目录,将它拷贝到硬盘,用VB打开该目录下的工程,稍作改进(如更换图标、添加功能等),然后编译成ocx控件,之后在VB中可以直接调用。
2.TUOPAN控件的属性:
InTray属性是用来设置是否显示在托盘中,True为显示在托盘,False为不显示;
TrayIcon属性是在托盘中显示的图标式样;
TrayTip属性是鼠标移动到该控件上面时,显示提示文字。
第五章程序设置
5.1用户的登陆
本设计采用TCP协议,因此,在介绍客户端时需要同时介绍与其相关的服务器程序。
先运行服务器端,再运行客户端。
一、客户端:
登陆界面如图5-1:
图5-1登陆界面
登录流程图如图5-2:
图5-2登录流程图
1.尝试与服务器的ws2控件组建立连接
PrivateSubForm_Load()
ws1.RemoteHost="127.0.0.1"‘远程计算机设备的IP地址
ws1.RemotePort=1002‘远程计算机联机端口设为1002
ws1.Connect
EndSub
2.在登陆界面中填写用户名和ip和端口号,若信息有为空的,则会给出提示。
若都没有空,则发向服务器验证。
PrivateSubcmd1_Click()
IfText1.Text=""OrText2.Text=""OrText3.Text=""Then
MsgBox"请确认信息后再登录!
"
Text3.SetFocus
ElseIfFrmc1.Wc.State=0Then
Frmc1.Wc.RemoteHost=Text1.Text‘远程计算机的IP地址为text1的内容
Frmc1.Wc.RemotePort=Text2.Text’远程计算机联机端口为text2的内容
Frmc1.user=Text3.Text‘用户昵称设为text3的内容
Frmc1.Wc.Connect‘Wc连接服务器
Fori=0To100000
DoEvents
Next
IfFrmc1.Wc.State<>7Then
MsgBox"无法连接,连接超时!
"
Frmc1.Wc.Close
Else
UnloadMe
EndIf
Else
MsgBox"您已连接!
"
EndIf
EndIf
EndSub
二、服务器端:
服务器端主机图片如图5-3:
图5-3服务端主机
客户端流程图如图5-4:
图5-4服务端流程图
1.客户端有用户请求登陆,服务端响应:
PrivateSubWs1_ConnectionRequest(ByValrequestIDAsLong)
Fori=0ToWs2.UBound
IfWs2(i).State=0Then
Ws2(i).AcceptrequestID‘接收连接
ExitFor
EndIf
Next
Ifi=Ws2.UBound+1Then
LoadWs2(Ws2.UBound+1)‘多个用户请求联机,则产生多个Ws2
Ws2(Ws2.UBound).AcceptrequestID
EndIf
EndSub
2.显示好友在list:
PrivateSubWs2_DataArrival(IndexAsInteger,ByValytesTotalAsLong)
Dimst,s,m,hAsString
Dimv,o,nAsInteger
st=""
Ws2(Index).GetDatast
s=Left(st,1)
t=Right(st,Len(st)-1)
Ws2(j).SendData"s"&m&"|"&v‘发送”s”,”m”和”v”所代表的信息
DoEvents
Ws2(j).SendData"f"&h
EndSub
3.服务端向所有用户发送系统信息:
PrivateSubCmd1_Click()‘点击服务器端的发送按钮
IfList1.ListCount<>0Then‘如果有用户登录则会向用户发送系统信息
Fori=0ToWs2.UBound
IfWs2(i).State=7Then
Ws2(i).SendData"x"&"系统消息:
"&Text2.Text
DoEvents
EndIf
Next
Text1.Text=Text1.Text&"系统消息:
"&Text2.Text&Chr(13)&Chr(10)
Text1.SelStart=Len(Text1.Text)
Text2.Text=""
Text2.SetFocus
EndIf
EndSub
5.2注册
一、客户端:
在用户没有注册的情况下,用户可点击“注册”按钮,进入注