你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
QQ聊天程序的网络通信原理及编程(下)
 

7)客户端接受在线好友的连接请求

在以服务端方式接受连接请求时,根据bUsedServer(i)判断与之对应的WinsockClientServer(i)是否被使用,如未使用,则通过Load方法将WinsockClientServer(i)控件动态载入,随后调用Accept方法接受客户端程序连接请求。

Public bUsedServer(1 To MaxOnlineFriend) As Boolean

Private Sub WinsockClientServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)

    If Index <> 0 Then Exit Sub

    For i = 1 To MaxOnlineFriend

        If Not bUsedServer(i) Then

            Load WinsockClientServer(i)

            WinsockClientServer(i).Accept requestID

            bUsedServer(i) = True

            Exit For

        End If

    Next i

End Sub

8)客户端显示在线好友

当在线好友接受连接后,则将该在线好友的ID显示在列表框ListFriendID中,并将与该在线好友连接的Winsock的下标值加入另一个隐藏的列表框ListSockIndex中,两个列表框对应,以便后面从ID列表框中选择好友发送聊天消息时,能马上知道与该好友连接的Winsock下标值。

Private Sub WinsockClientClient_Connect(Index As Integer)

If Index = 0 Then Exit Sub

ListFriendID.AddItem OnlineFriendInfo(Index).UserID

ListSockIndex.AddItem Index

End Sub

2.聊天

完全在客户端程序之间进行。

1)发送

注意聊天者发送聊天数据前先要在列表框ListFriendID中选择欲与之通话的好友ID。程序根据所选好友在ListFriendID列表框中的位置从与之对应的ListSockIndex列表框中找到WinsockClientClient控件的下标值,然后用该Winsock发送聊天内容,同时通过自定义过程SetRichColorText将聊天内容、聊天双方ID及时间以不同颜色显示在发送端聊天窗体的RichTextBox中,SetRichColorText过程的具体实现见源程序。

Private Sub CommandTcpSend_Click()

If ListFriendID.ListIndex < 0 Then Exit Sub

SockIndex = ListSockIndex.List(ListFriendID.ListIndex)

If WinsockClientClient(SockIndex).State = sckConnected Then

    SetRichColorText CStr(Now), MyID, ListFriendID.Text, Text1.Text, False

    WinsockClientClient(SockIndex).SendData Text1.Text & Chr(2)

    DoEvents

End If

End Sub

2)接收

接收时读取每条聊天内容,并根据发送方的IP地址WinsockClientServer(Index).RemoteHostIPOnlineFriendInfo数组中找到发送方的ID,通过自定义过程SetRichColorText将聊天内容、聊天双方ID及时间以不同颜色显示在接收端聊天窗体的RichTextBox中。

Private Sub WinsockClientServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)

If Index = 0 Then Exit Sub

Dim tmpstr As String

Dim EndFlagLoc As Integer

WinsockClientServer(Index).GetData tmpstr, , bytesTotal

BufferMsg(Index) = BufferMsg(Index) & tmpstr

EndFlagLoc = InStr(BufferMsg(Index), Chr(2))

While EndFlagLoc > 0

    strMsg = Left$(BufferMsg(Index), EndFlagLoc - 1)

    For i = 1 To MaxOnlineFriend

        If OnlineFriendInfo(i).IPAddr = WinsockClientServer(Index).RemoteHostIP Then Exit For

    Next i

    SetRichColorText CStr(Now), OnlineFriendInfo(i).UserID, MyID, strMsg, True

    BufferMsg(Index) = Mid(BufferMsg(Index), EndFlagLoc + 1)

    EndFlagLoc = InStr(BufferMsg(Index), Chr(2))

Wend

End Sub

3.离线

当一个用户离线时,作为聊天程序的服务器程序以及其他在线好友的聊天程序上与之通信的Winsock都会收到Close消息,此时要做一些处理工作。

1)服务器程序

清除该在线用户的信息,卸载与之通信的WinsockServer控件。

Private Sub WinsockServer_Close(Index As Integer)

    OnlineUserInfo(Index).bUsed = False

    OnlineUserInfo(Index).bLogined = False

OnlineUserInfo(Index).IPAddr = ""

OnlineUserInfo(Index).UserID = ""

BufferRecv(Index) = ""

    WinsockServer(Index).Close

    Unload WinsockServer(Index)

End Sub

2)客户端程序

卸载与之通信的WinsockClientClient控件,从ListFriendID列表框中清除该在线好友的 ID,从ListSockIndex列表框中清除该在线好友所对应WinsockClientClient控件的下标值,从OnlineFriendInfo数组中清除该在线好友的信息。

Private Sub WinsockClientClient_Close(Index As Integer)

WinsockClientClient(Index).Close

Unload WinsockClientClient(Index)

For i = 0 To ListFriendID.ListCount - 1

    If ListFriendID.List(i) = OnlineFriendInfo(Index).UserID Then

        ListFriendID.RemoveItem i

        ListSockIndex.RemoveItem i

        Exit For

    End If

Next i

OnlineFriendInfo(Index).bUsed = False

OnlineFriendInfo(Index).IPAddr = ""

OnlineFriendInfo(Index).UserID = ""

BufferMsg(Index) = ""

End Sub

卸载与之通信的WinsockClientServer控件。

Private Sub WinsockClientServer_Close(Index As Integer)

    If Index = 0 Then Exit Sub

    bUsedServer(i) = False

    WinsockClientServer(Index).Close

    Unload WinsockClientServer(Index)

End Sub

本程序在VB6.0中已通过调试。

 

参考文献

 

1Anthony Jones.WINDOWS网络编程技术.机械工业出版社,20003.

  推荐精品文章

·一文解读:工程师常用的接口大全
·谷歌在深圳设立办公室 或专注硬件业务
·甲骨文发布关键补丁 修复英特尔芯片漏洞
·容器圈2017年回顾及2018年技术热点预测
·外媒速递:Web开发者与用户界面开发者之间…
·在2018年最值得去学习的编程语言
·共享医疗来了!温州全民健康信息化“十三…
·百度 CES 发布会:重磅推出 Apollo 2.0,…
·数据科学热到爆,如何让数据成为运维的大…
·芯片涨价潮再度来袭,2018芯片国产化迫在…
·美团云+AI,打造最开放人工智能平台,带来…
·京东京麦:微服务架构下的高可用网关与容…
·阿里云计算公司总部效果图曝光 预计2021年…
·东进:加密将成为中国企业数据安全的标配…

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备06048724号,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区长春桥路5号6号楼1209室,邮编:100089