当前位置:主页 > 科技论文 > 网络通信论文 >

QQ聊天程序的网络通信原理及编程

发布时间:2016-08-16 10:02

  本文关键词: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


Copyright(c)文论论文网All Rights Reserved | 网站地图 |

版权申明:资料由用户cc42b***提供,本站仅收录摘要或目录,作者需要删除请E-mail邮箱bigeng88@qq.com