QQ聊天程序的網(wǎng)絡(luò)通信原理及編程
本文關(guān)鍵詞:QQ聊天程序的網(wǎng)絡(luò)通信原理及編程,由筆耕文化傳播整理發(fā)布。
QQ聊天程序的網(wǎng)絡(luò)通信原理及編程的論文,對(duì)網(wǎng)絡(luò)編程學(xué)習(xí)很有幫助
●●●-●●-●●-t----●---●●-●__--●●-●---●-●●---●●-●-●●-●●●-----●_●川●-●●-
●
實(shí)用第一/智慧密集
。。...........。............。。。..。...........。..。.............。......。。j?代表什么含義,每條數(shù)據(jù)最前面有代表不同含義的數(shù)據(jù)含義標(biāo),
DimtmpstrAsString
記字符串,每條數(shù)據(jù)后有相同的數(shù)據(jù)結(jié)束標(biāo)記符,每條數(shù)據(jù)中各子數(shù)據(jù)間有子數(shù)據(jù)分割標(biāo)記符。各數(shù)據(jù)含義標(biāo)記字符串如下:
Public
ConstOnlineFriendlPlD=’FriendlPID’
7表示本數(shù)據(jù)中包含在線好友的IP地址和lD
Public
ConstLogin=。UserLogin’
’表示本數(shù)據(jù)中包含登錄用戶的用戶ID和密碼
PublicConstNotUser=’IsNotUser’
7本數(shù)據(jù)含義為“不是合法用戶”
PublicConstIsUser=+ThislsUser’
7本數(shù)據(jù)含義為“是合法用戶”
為了識(shí)別數(shù)據(jù)含義方便,含義標(biāo)記字符串長(zhǎng)度一致,我這里采用的長(zhǎng)度為10。
PublicConstHeadLength=lO
關(guān)于分割標(biāo)記符和結(jié)束標(biāo)記符,我采用數(shù)值1和2轉(zhuǎn)字符的方法,因?yàn)樗鼈冝D(zhuǎn)成的字符不是普通字符,不會(huì)和傳送的數(shù)據(jù)如用戶ID、密碼、IP地址等字符串?dāng)?shù)據(jù)混淆。
具體發(fā)送數(shù)據(jù)通過SendData方法進(jìn)行,發(fā)送登錄用戶名和密碼的語句如下,數(shù)據(jù)的格式為:數(shù)據(jù)含義標(biāo)記字符串+用戶名+分割標(biāo)記符+密碼+結(jié)束標(biāo)記符。
PrivateSub
WinsockClient_Connect《}
WinsockClient.SendDataLogin&TextUsername.Text&Chr
《1)&TextPassword.Text&Chr(2)EndSub
(5)接收收據(jù)
當(dāng)有數(shù)據(jù)到達(dá)時(shí),程序會(huì)收到消息觸發(fā)DataArrival事件,所以不論服務(wù)端還是客戶端程序接收數(shù)據(jù)的工作在DataArrival事件方法中完成。具體接收數(shù)據(jù)使用GetData方法進(jìn)行,為了防止客戶端發(fā)送來的數(shù)據(jù)太多,服務(wù)端來不及處理,我定義了一個(gè)字符串?dāng)?shù)組BufferRecv,該數(shù)組與WinsockServer控件數(shù)組對(duì)應(yīng),WinsockServer(1ndex)控件收到的數(shù)據(jù)添加在BufferRecv(Index)中,然后通過結(jié)束標(biāo)記符在BufferRecv《Index)中取出一條條數(shù)據(jù)進(jìn)行分析。如果是客戶登錄,則獲取用戶名和密碼,然后通過自定義函數(shù)Lookfor在數(shù)據(jù)庫(kù)中驗(yàn)證。如果驗(yàn)證為合法用戶,則發(fā)送“是合法用戶”數(shù)據(jù)標(biāo)記,然后將用戶lD和用戶機(jī)器的lP等信息置于一個(gè)在線用戶信息的結(jié)構(gòu)數(shù)組中備用。然后通過自定義函數(shù)GetFriend在數(shù)據(jù)庫(kù)中獲取該用戶的所有好友ID及好友人數(shù),并根據(jù)在線用戶信息數(shù)組逐一判斷各個(gè)好友是否在線,如果在線,則將在線好友的ID及IP地址發(fā)送給剛登錄的客戶,同時(shí)也將剛登錄客戶的ID及IP地址發(fā)送給在線好友,以便他們相互之間能夠通信。如果驗(yàn)證為非法用戶,,則發(fā)送“不是合法用戶”數(shù)據(jù)標(biāo)記,并將與該客戶通信用的Winsock控件卸載。
PrivateSubWinsockServer_DataArrival(IndexAsInteger,ByValbytesTotalAs
Long)
萬方數(shù)據(jù)
DimEndFlagLocAsInteger7結(jié)束標(biāo)記所處位置變量
IfIndex=0ThenExitSub
WinsockServer(Index).GetDatatmpstr,,bytesTotal
’接收收據(jù)存入tmpstr中
BufferRecv(Index)=BufferRecv(Index)&tmpstr
7將收到的數(shù)據(jù)添加在BufferRecv(Index)中
EndFlagLoc=InStr(BufferRecv(Index),Chr{2))
’在BufferRecv{Index)中尋找第一個(gè)結(jié)束標(biāo)記符的位置WhileEndFlagLoc>0
7在BufferRecv(Index)中取第一個(gè)結(jié)束標(biāo)記符左邊的數(shù)據(jù),’即第一條數(shù)據(jù).
strMsg=LeftS《BufferRecv(Index),EndFlagLoc一1)
’獲取本條數(shù)據(jù)前面的數(shù)據(jù)含義標(biāo)記字符串以分析本條數(shù)據(jù)的7含義.
SelectCaseLeftSfstrMsg,HeadLength)
CaseLogin’如果是登錄數(shù)據(jù)Dim
tmpPassWordAsString
DimtmpUserlDAsString
7通過Mid方法取得數(shù)據(jù)含義標(biāo)記字符串之后分割標(biāo)’記符之前的數(shù)據(jù).即登錄用戶名.
tmpUserlD=Mid《strMsg,HeadLength4-1,InStr{strMsg.Chr(1))一1一HeadLength)
7通過Mid方法取得分割標(biāo)記符之后的數(shù)據(jù),即登錄密碼.tmpPassWord=Mid(strMsg,InStr(strMsg,Chr(1))+1)’通過自定義函數(shù)Lookfor在數(shù)據(jù)庫(kù)中查詢?cè)撚脩裘艽a是否。存在,如存在則發(fā)送含義為“是合法用戶”的數(shù)據(jù),Lookfor函’數(shù)的具體實(shí)現(xiàn)見源程序.
IfLookfor(tmpUserlD,tmpPassWord)Then
WinsockServer{Index}.SendDataIsUser&Chr(2)
DoEvents
’將客戶端的lP地址和用戶lD等信息置于一個(gè)有關(guān)在線用戶’信息的結(jié)構(gòu)數(shù)組中備用,并設(shè)置登錄標(biāo)志變量bLogined為
’True.
OntineUserlnfo(Index).IPAddr=WinsockServer《Index)
.RemoteHostlP
OnlineUserlnfofIndex).UserlD=tmpUserlD
OnlineUserlnfo(Index).bLogined=True
DimAtlFriendlDAsString
DimFriendlDAsStringDimFriendCountAs
nteger
DimTOIdFriendCOuntAsnteger
’然后通過自定義函數(shù)GetFriend在數(shù)據(jù)庫(kù)中獲取該用戶的所7有好友的ID及好友人數(shù).分別放在參數(shù)AIIFriendlD和
FriendCount中.
If
GetFriend(tmpUserlD.AlIFriendlD,FriendCount}Then
’然后根據(jù)在線用戶信息數(shù)組用InStr函數(shù)逐一判斷在線用戶’是否是該用戶的好友.
Fori=1ToMaxOnlineUser
If
OnlineUserlnfo《i).bLoginedThen
IfInStr《AIIFriendlD,On№eUserInfoli).UserlD)>0Then
’如果是,則將在線好友的ID及IP地址發(fā)送給剛登錄的客
本文關(guān)鍵詞:QQ聊天程序的網(wǎng)絡(luò)通信原理及編程,由筆耕文化傳播整理發(fā)布。
本文編號(hào):95196
本文鏈接:http://sikaile.net/kejilunwen/wltx/95196.html