天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

QQ聊天程序的網(wǎng)絡(luò)通信原理及編程(上)

發(fā)布時間:2016-08-16 10:02

  本文關(guān)鍵詞:QQ聊天程序的網(wǎng)絡(luò)通信原理及編程,由筆耕文化傳播整理發(fā)布。


QQ聊天程序的網(wǎng)絡(luò)通信原理及編程(上)

、           原理

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

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

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

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

用于在線好友間直接通信聊天。此時每個客戶端程序上既有實(shí)現(xiàn)服務(wù)端功能的部分,又有實(shí)現(xiàn)客戶端功能的部分,前者用于接收聊天數(shù)據(jù),后者用于發(fā)送聊天數(shù)據(jù)。

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

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

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

控件名
是否為數(shù)組
作用
在哪個程序中

WinsockServer

用于和客戶端通信
服務(wù)端程序

WinsockClient

用于和服務(wù)端通信
客戶端程序

WinsockClientServer

用于接收在線好友的聊天信息
客戶端程序

WinsockClientClient

用于向在線好友發(fā)送聊天信息
客戶端程序


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

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



二、編程

1.登錄

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

(1)監(jiān)聽

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

Private Sub Form_Load()

    ConDB’ 自定義函數(shù)ConDB用于和存儲用戶信息的數(shù)據(jù)庫連接,具體實(shí)現(xiàn)見源程序。

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

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

    WinsockServer(0).Listen’ 監(jiān)聽

End Sub

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

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

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

WinsockClient.Protocol = sckTCPProtocol ‘設(shè)置通信協(xié)議為TCP

WinsockClient.RemoteHost = "127.0.0.1" ‘要設(shè)置正確的服務(wù)器IP地址

WinsockClient.RemotePort = 8888 ‘遠(yuǎn)程端口

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

End Sub

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

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

Type OnlineUserInformation

    bUsed As Boolean  ‘對應(yīng)下標(biāo)的Winsock控件是否已被載入在用

    UserID  As String  ‘對應(yīng)的用戶ID

    IPAddr As String  ‘對應(yīng)的客戶機(jī)IP地址

    bLogined As Boolean  ‘對應(yīng)的用戶是否登錄

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


  本文關(guān)鍵詞:QQ聊天程序的網(wǎng)絡(luò)通信原理及編程,由筆耕文化傳播整理發(fā)布。



本文編號:95198

資料下載
論文發(fā)表

本文鏈接:http://sikaile.net/kejilunwen/wltx/95198.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶be64e***提供,本站僅收錄摘要或目錄,作者需要刪除請E-mail郵箱bigeng88@qq.com
亚洲欧美日韩在线看片| 午夜福利在线观看免费| 香蕉网尹人综合在线观看| 中文字幕亚洲精品在线播放| a久久天堂国产毛片精品| 黄片三级免费在线观看| 亚洲国产丝袜一区二区三区四| 成人精品日韩专区在线观看| 国产不卡的视频在线观看| 一区二区欧美另类稀缺| 日韩精品一区二区三区av在线| 在线日本不卡一区二区| 中文字幕人妻一区二区免费| 色老汉在线视频免费亚欧| 日韩欧美三级视频在线| 亚洲一区二区精品福利| 日韩高清一区二区三区四区 | 国产又大又硬又粗又湿| 欧美日韩国产综合在线| 成人国产激情在线视频| 国产精品大秀视频日韩精品| 亚洲一区二区精品国产av| 丁香七月啪啪激情综合| 在线观看中文字幕91| 国产在线观看不卡一区二区| 久久三级国外久久久三级| 99久久国产精品免费| 91熟女大屁股偷偷对白| 成年人免费看国产视频| 精品国产日韩一区三区| 嫩草国产福利视频一区二区| 最近中文字幕高清中文字幕无| 欧美综合色婷婷欧美激情| 亚洲国产性感美女视频| 女生更色还是男生更色| 精品一区二区三区人妻视频| 人妻露脸一区二区三区| 日本特黄特色大片免费观看| 97人妻精品一区二区三区男同 | 午夜精品国产精品久久久| 少妇高潮呻吟浪语91|