1. <li id="3se62"></li>
      <th id="3se62"></th>

      <progress id="3se62"></progress>
         你好,歡迎來到電腦編程技巧與維護雜志社! 雜志社簡介廣告服務讀者反饋編程社區  
        合訂本訂閱
         
         
        您的位置:雜志經典 / 網絡與通信
        QQ聊天程序的網絡通信原理及編程(上)
         

          本文分析了QQ聊天程序的網絡通信原理,在服務端和客戶端之間分別采用兩套C/S通信模式;實現客戶端和客戶端通信,并用VB編程完成類似QQ的網絡通信程序。

        關鍵詞  QQ, C/S, Winsock, TCP

         

         

        隨著計算機網絡的普及,網上聊天已成了和電話一樣重要且更經濟的一種通信方式。QQ是人們網上聊天的首選,在許多人的聯系方式中,QQ號是其中之一。惹想自己也設計一個類似QQ的聊天程序,與騰訊公司爭奪市場,這也許是一件令你望而生畏的事情,但其實并不如你所想象的復雜,可以嘗試一下。

         

        一、           原理

        QQ聊天程序采用的是C/S通信模式,即客戶/服務模式,它把一個應用劃分成功能不同的兩個部分,分別在不同的計算機上運行,其中一個為服務端程序,用來響應和提供固定的服務,一個為客戶端程序,用來向服務端提出請求和要求某種服務。在數量關系上,通常有一對一的(即一個服務端程序和一個客戶端程序之間通信),也有一對多的(即一個服務端程序和多個客戶端程序之間通信),也有多對多的(即多個服務端程序和多個客戶端程序之間通信)。所謂服務端程序、客戶端程序也是相對的概念,有時在一個程序中既有服務端又有客戶端的功能。QQ聊天程序分成了兩個程序,一個安裝在騰訊公司的服務器上,我們稱之為服務端程序,一個安裝在QQ用戶的計算機上,我們稱之為客戶端程序。在許多介紹網絡通信編程的書籍中有關網絡聊天的例子,當一個客戶要與另一個客戶聊天時,第一個客戶先把聊天數據發送給服務器,然后服務器再把聊天數據轉發給第二個客戶,服務器好像一個中轉站,這在客戶數量比較少時,服務器還能承受,在客戶數量比較多時,服務器肯定要癱瘓。何況客戶之間還要傳送文件、語音聊天、視頻聊天等等,為了減少服務器的壓力,各客戶端之間需要直接通信。

        1.在服務端和客戶端之間(一對多)

        用于客戶端程序登錄,驗證用戶密碼,獲取其它在線好友信息等等。

        2.在客戶端和客戶端之間(多對多)

        用于在線好友間直接通信聊天。此時每個客戶端程序上既有實現服務端功能的部分,又有實現客戶端功能的部分,前者用于接收聊天數據,后者用于發送聊天數據。

        在用C/S模式進行通信時,作為客戶端在請求與服務端連接時需要知道服務端的IP地址,騰訊公司的服務器具有固定的公網地址,這沒有問題。但是在客戶端和客戶端之間通信時,每個用戶的IP地址都是ISP所給的臨時地址,無法固定,那么某個用戶要與另一個用戶連接時,怎么知道對方的IP地址呢?當一個用戶連接到Internet后,獲得了一個臨時的公網地址,當登錄到QQ時,QQ服務端會獲得該上線用戶的IP地址,然后告知其他要與該上線用戶聊天的用戶,其他用戶就可以連接該用戶與之直接通信了。

        Win32平臺上,對于眾多的基層網絡協議,Winsock是訪問它們的首選接口。如果想從頭開發一個網絡通信應用程序,TCP/IP就是首選協議之一。為了保證可靠的數據傳輸,宜選擇TCP協議。在開發工具方面,VC是我的首選,但VB可能擁有更多的使用者,所以我用VB6.0作為開發工具編程實現,以便更多的讀者能夠理解。喜歡VC的的讀者要將其轉化成VC下的代碼也很容易。在VB中有一個Winsock控件,它為VB網絡編程提供了一條便捷的途徑。

        本程序中用到的Winsock控件如下表:

        控件名

        是否為數組

        作用

        在哪個程序中

        WinsockServer

        用于和客戶端通信

        服務端程序

        WinsockClient

        用于和服務端通信

        客戶端程序

        WinsockClientServer

        用于接收在線好友的聊天信息

        客戶端程序

        WinsockClientClient

        用于向在線好友發送聊天信息

        客戶端程序

        由于本文的主題是網絡通信,所以本程序中所涉及的一些其它功能如數據庫訪問等的實現,限于篇幅不進行闡述,有興趣的讀者可以參考源程序。為了闡述方便,本程序中服務端只用了一個窗體,客戶端只用了兩個窗體,分別是登錄窗體和聊天窗體。

        接下來我們按照QQ聊天程序的所需實現的功能一步步編程實現,其中服務端程序和客戶端程序沒有分開闡述,而是按照所應實現功能的先后次序一并闡述,便于讀者理解及按此順序編程調試。

         

        二、編程

        1.登錄

        使用QQ的人都知道,用QQ聊天第一步是登錄,這一步看似簡單,其實程序做了不少事情。當用戶啟動QQ聊天客戶端程序,出現登錄界面,用戶輸入用戶名和密碼,點擊登錄按鈕后,在用戶機上的客戶端程序首先請求與服務端程序建立連接,服務端程序接受客戶端程序連接請求?蛻舳顺绦蛟诖_保已和服務端程序建立連接后發送登錄時用戶輸入的用戶名和密碼,服務端程序收到后,根據用戶信息數據庫中數據驗證。如果驗證為合法用戶,客戶端程序則顯示聊天窗體,并從服務端獲取在線好友信息,以便直接與各在線好友逐一建立新的通信機制,實現好友間直接通信。具體實現步驟如下:

        (1)監聽

        先在窗體上加一個Winsock控件,名稱設為“WinsockServer”。由于服務端需要和所有客戶端通信,需要很多Winsock控件,因此把剛加入的Winsock控件WinsockServer改為數組,只要將Winsock控件的Index屬性設為0即可,此時WinsockServer數組只有一個元素,以后可根據需要動態增減。當窗體載入時,只會創建WinsockServer(0)這一個Winsock控件實例。作為服務端程序,首先要有一個Winsock用于監聽客戶端的連接請求,自然就用WinsockServer(0)作為監聽Winsock,所以先要設置其通信協議為TCP,然后設置本地端口,以便客戶端通過該端口與服務端連接,最后通過Listen方法監聽。

        Private Sub Form_Load()

            ConDB’ 自定義函數ConDB用于和存儲用戶信息的數據庫連接,具體實現見源程序。

            WinsockServer(0).Protocol = sckTCPProtocol ‘設置通信協議為TCP

            WinsockServer(0).LocalPort = 8888 ‘設置本地端口

            WinsockServer(0).Listen’ 監聽

        End Sub

        (2)請求與服務端程序建立連接

        當用戶輸入用戶名和密碼單擊登錄按鈕后,在用戶機上的客戶端程序所做的事情是先請求與服務端程序建立連接,這需要先在客戶端程序的登錄窗體上加一個Winsock控件,名稱設為“WinsockClient”。然后設置通信協議,要連接的服務器IP地址,遠程端口號要與服務端監聽所設置的本地端口一致,最后通過Connect方法請求與服務端程序建立連接。

        Private Sub Command1_Click() ‘單擊登錄按鈕事件

        WinsockClient.Protocol = sckTCPProtocol 設置通信協議為TCP

        WinsockClient.RemoteHost = "127.0.0.1" 要設置正確的服務器IP地址

        WinsockClient.RemotePort = 8888 ‘遠程端口

        WinsockClient.Connect ‘請求與服務端程序建立連接

        End Sub

        (3)接受客戶端程序連接請求

        當客戶端請求與服務端程序建立連接時,處于監聽狀態的服務端會收到消息觸發ConnectionRequest事件,所以服務端程序接受客戶端程序連接請求的工作在ConnectionRequest事件方法中完成。由于WinsockServer(0)專用于監聽,所以要新加載一個Winsock控件與該客戶端通信,為了保留每個在線客戶的信息,我定義了一個OnlineUserInformation結構類型的數組OnlineUserInfo,它和Winsock控件數組相對應,比如OnlineUserInfo(i)中存放的是與WinsockServer (i)通信客戶端的信息,其中OnlineUserInfo(i).bUsed表示WinsockServer (i)控件是否已被載入在與某個客戶端通信使用,如未使用,則通過Load方法將WinsockServer (i)控件動態載入,隨后調用Accept方法接受客戶端程序連接請求。其中MaxOnlineUser是一個常量,表示最大在線用戶數量。

        Type OnlineUserInformation

            bUsed As Boolean  對應下標的Winsock控件是否已被載入在用

            UserID  As String  對應的用戶ID

            IPAddr As String  對應的客戶機IP地址

            bLogined As Boolean  對應的用戶是否登錄

        End Type

        Public OnlineUserInfo(1 To MaxOnlineUser) As OnlineUserInformation

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

            If Index = 0 Then

                For i = 1 To MaxOnlineUser

                    If Not OnlineUserInfo(i).bUsed Then

                        Load WinsockServer(i)

                        WinsockServer(i).Accept requestID

                         OnlineUserInfo(i).bUsed = True

                        Exit For

                    End If

                Next i

            End If

        End Sub

          推薦精品文章

        ·2023年7月目錄
        ·2023年6月目錄 
        ·2023年5月目錄
        ·2023年4月目錄 
        ·2023年3月目錄 
        ·2023年2月目錄 
        ·2023年1月目錄 
        ·2022年12月目錄 
        ·2022年11月目錄 
        ·2022年10月目錄 
        ·2022年9月目錄 
        ·2022年8月目錄 
        ·2022年7月目錄 
        ·2022年6月目錄 

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

          友情鏈接
         
        Copyright 2001-2010, www.1wcdp.top, All Rights Reserved
        京ICP備14022230號-1,電話/傳真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
        地址:北京市海淀區遠大路20號寶藍大廈E座704,郵編:100089 
        1. <li id="3se62"></li>
          <th id="3se62"></th>

          <progress id="3se62"></progress>
            操美女小骚逼