QQ聊天程序的网络通信原理及编程
本文关键词:QQ聊天程序的网络通信原理及编程,由笔耕文化传播整理发布。
QQ聊天程序的网络通信原理及编程的论文,对网络编程学习很有帮助
●●●-●●-●●-t----●---●●-●__--●●-●---●-●●---●●-●-●●-●●●-----●_●川●-●●-
●
实用第一/智慧密集
。。...........。............。。。..。...........。..。.............。......。。j?代表什么含义,每条数据最前面有代表不同含义的数据含义标,
DimtmpstrAsString
记字符串,每条数据后有相同的数据结束标记符,每条数据中各子数据间有子数据分割标记符。各数据含义标记字符串如下:
Public
ConstOnlineFriendlPlD=’FriendlPID’
7表示本数据中包含在线好友的IP地址和lD
Public
ConstLogin=。UserLogin’
’表示本数据中包含登录用户的用户ID和密码
PublicConstNotUser=’IsNotUser’
7本数据含义为“不是合法用户”
PublicConstIsUser=+ThislsUser’
7本数据含义为“是合法用户”
为了识别数据含义方便,含义标记字符串长度一致,我这里采用的长度为10。
PublicConstHeadLength=lO
关于分割标记符和结束标记符,我采用数值1和2转字符的方法,因为它们转成的字符不是普通字符,不会和传送的数据如用户ID、密码、IP地址等字符串数据混淆。
具体发送数据通过SendData方法进行,发送登录用户名和密码的语句如下,数据的格式为:数据含义标记字符串+用户名+分割标记符+密码+结束标记符。
PrivateSub
WinsockClient_Connect《}
WinsockClient.SendDataLogin&TextUsername.Text&Chr
《1)&TextPassword.Text&Chr(2)EndSub
(5)接收收据
当有数据到达时,程序会收到消息触发DataArrival事件,所以不论服务端还是客户端程序接收数据的工作在DataArrival事件方法中完成。具体接收数据使用GetData方法进行,为了防止客户端发送来的数据太多,服务端来不及处理,我定义了一个字符串数组BufferRecv,该数组与WinsockServer控件数组对应,WinsockServer(1ndex)控件收到的数据添加在BufferRecv(Index)中,然后通过结束标记符在BufferRecv《Index)中取出一条条数据进行分析。如果是客户登录,则获取用户名和密码,然后通过自定义函数Lookfor在数据库中验证。如果验证为合法用户,则发送“是合法用户”数据标记,然后将用户lD和用户机器的lP等信息置于一个在线用户信息的结构数组中备用。然后通过自定义函数GetFriend在数据库中获取该用户的所有好友ID及好友人数,并根据在线用户信息数组逐一判断各个好友是否在线,如果在线,则将在线好友的ID及IP地址发送给刚登录的客户,同时也将刚登录客户的ID及IP地址发送给在线好友,以便他们相互之间能够通信。如果验证为非法用户,,则发送“不是合法用户”数据标记,并将与该客户通信用的Winsock控件卸载。
PrivateSubWinsockServer_DataArrival(IndexAsInteger,ByValbytesTotalAs
Long)
万方数据
DimEndFlagLocAsInteger7结束标记所处位置变量
IfIndex=0ThenExitSub
WinsockServer(Index).GetDatatmpstr,,bytesTotal
’接收收据存入tmpstr中
BufferRecv(Index)=BufferRecv(Index)&tmpstr
7将收到的数据添加在BufferRecv(Index)中
EndFlagLoc=InStr(BufferRecv(Index),Chr{2))
’在BufferRecv{Index)中寻找第一个结束标记符的位置WhileEndFlagLoc>0
7在BufferRecv(Index)中取第一个结束标记符左边的数据,’即第一条数据.
strMsg=LeftS《BufferRecv(Index),EndFlagLoc一1)
’获取本条数据前面的数据含义标记字符串以分析本条数据的7含义.
SelectCaseLeftSfstrMsg,HeadLength)
CaseLogin’如果是登录数据Dim
tmpPassWordAsString
DimtmpUserlDAsString
7通过Mid方法取得数据含义标记字符串之后分割标’记符之前的数据.即登录用户名.
tmpUserlD=Mid《strMsg,HeadLength4-1,InStr{strMsg.Chr(1))一1一HeadLength)
7通过Mid方法取得分割标记符之后的数据,即登录密码.tmpPassWord=Mid(strMsg,InStr(strMsg,Chr(1))+1)’通过自定义函数Lookfor在数据库中查询该用户名密码是否。存在,如存在则发送含义为“是合法用户”的数据,Lookfor函’数的具体实现见源程序.
IfLookfor(tmpUserlD,tmpPassWord)Then
WinsockServer{Index}.SendDataIsUser&Chr(2)
DoEvents
’将客户端的lP地址和用户lD等信息置于一个有关在线用户’信息的结构数组中备用,并设置登录标志变量bLogined为
’True.
OntineUserlnfo(Index).IPAddr=WinsockServer《Index)
.RemoteHostlP
OnlineUserlnfofIndex).UserlD=tmpUserlD
OnlineUserlnfo(Index).bLogined=True
DimAtlFriendlDAsString
DimFriendlDAsStringDimFriendCountAs
nteger
DimTOIdFriendCOuntAsnteger
’然后通过自定义函数GetFriend在数据库中获取该用户的所7有好友的ID及好友人数.分别放在参数AIIFriendlD和
FriendCount中.
If
GetFriend(tmpUserlD.AlIFriendlD,FriendCount}Then
’然后根据在线用户信息数组用InStr函数逐一判断在线用户’是否是该用户的好友.
Fori=1ToMaxOnlineUser
If
OnlineUserlnfo《i).bLoginedThen
IfInStr《AIIFriendlD,On№eUserInfoli).UserlD)>0Then
’如果是,则将在线好友的ID及IP地址发送给刚登录的客
本文关键词:QQ聊天程序的网络通信原理及编程,由笔耕文化传播整理发布。
本文编号:95196
本文链接:https://www.wllwen.com/kejilunwen/wltx/95196.html