• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woomsg

            在路上

            gloox代碼分析1 - connect模塊

            主要分析gloox的connect模塊,涉及的文件:
            connectionbase.h
            connectiondatahander.h
            connectionhandler.h
            connectiontcpbase.h (connectiontcpbase.cpp)
            connectiontcpclient.h (connectiontcpclient.cpp)
            connectiontcpserver.h (connectiontcpserver.cpp)

            1. ConnectionBase抽象連接類,表示一個(gè)socket連接。
            3個(gè)數(shù)據(jù)成員:
            server和ip - 需要連接到的目標(biāo)地址和端口(在ConnectionTcpServer是要綁定的本地地址)
            connectionState - 連接的當(dāng)前狀態(tài) (一個(gè)三種狀態(tài)disconnected | connecting | connected)
            connectionDataHandler - 處理三類ConnectionBase中的三類事件 ( 數(shù)據(jù)接收 | 連接建立 | 連接斷開 )
            5個(gè)主要方法:
            connect - 建立一個(gè)socket連接
            disconnect - 斷開一個(gè)socket連接
            send - 發(fā)送數(shù)據(jù),該方法直到要發(fā)送的數(shù)據(jù)全部發(fā)送完畢才返回
            recv( int timeout ) - 接收數(shù)據(jù),接收到數(shù)據(jù)或者timeout返回
            receive - 把connection設(shè)置成"接收模式",也就是循環(huán)的調(diào)用recv接收數(shù)據(jù),直到連接斷開該方法返回,
                           該方法保證這個(gè)連接可以循環(huán)的接收數(shù)據(jù).

            注意: recv和receive的區(qū)別。


            2. ConnectionDataHandler處理繼承自ConnectionBase的對(duì)象的事件
            handlerReceivedData - 接收到數(shù)據(jù)
            handlerConnect - 一個(gè)原始的套接字連接建立
            handlerDisconnect - 一個(gè)原始的套接字連接斷開

            3. ConnectionTcpBase一個(gè)基本的TCP連接,繼承自ConnectionBase
            數(shù)據(jù)成員
            bool cancel - 表示連接是否應(yīng)該斷開,默認(rèn)為true. (true表示連接斷開)
                                 函數(shù)disconnect也就是僅僅設(shè)置cancel為true.
                                 在函數(shù)receive循環(huán)接收數(shù)據(jù)的邏輯中會(huì)檢測cancel,如果為true,則表示連接斷開,則返回,退出"接收模式"
            int bufSize - buf的大小,默認(rèn)是1024
            char* buf - 緩沖區(qū),大小事bufSize + 1 (在ConnectionTcpBase中并沒有用到這個(gè)緩沖區(qū),供上層使用E.g. ConnectionTcpClient的recv來接收數(shù)據(jù))

            實(shí)現(xiàn)的主要方法:
            send - 發(fā)送數(shù)據(jù)
            receive - "循環(huán)"接收數(shù)據(jù)
            dataAvailable( int timeout ) - 一個(gè)私有方法,作用是測試socket上目前是否有數(shù)據(jù)可讀,如果有返回true. 可以供recv調(diào)用. 避免了阻塞的調(diào)用原始套接字方法::receive或者::accept.

            4. ConnectionTcpClient實(shí)現(xiàn)一個(gè)基本的TCP連接,繼承自ConnectionTcpBase
            實(shí)現(xiàn)的主要方法
            connect - 連接到目標(biāo)地址,如果成功,則調(diào)用handler->handlerConnect,失敗則調(diào)用handler->handlerDisconnect
            recv - 接收數(shù)據(jù),如果接收到數(shù)據(jù),馬上調(diào)用handler->handlerReceiveData,接收發(fā)生錯(cuò)誤,表示連接斷開,調(diào)用handler->handlerDisconnect

            5. ConnectionHandler一個(gè)抽象類,用來接收一個(gè)客戶端連接的請(qǐng)求,該類用于ConnectionTcpServer
            只有一個(gè)接口:
            handleIncomingConnection( ConnectionBase *connect ) - &connect表示新建立的連接請(qǐng)求,哪原始的socket做類比相當(dāng)于accept返回的socket.

            注意: 區(qū)別于ConnectionDataHandler用于處理一個(gè)特定連接的中的事件(數(shù)據(jù)到來,連接斷開,連接建立),ConnectionListener用于XMPP Stream.

            6. ConnectionTcpServer,實(shí)質(zhì)上就是一個(gè)偵聽socket,同原始的socket做類比就是一個(gè)調(diào)用了bind/listen之后處于偵聽狀態(tài)的socket.
            主要數(shù)據(jù)成員:
            connectionHandler - 接收新到來的連接,接收到之后調(diào)用handlerIncomingConnection
            主要方法:
            connect - 建立套接字,綁定到本地地址,偵聽bind/listen
            recv - 調(diào)用accept接收一個(gè)socket連接,如果成功,則用accpet返回的socket創(chuàng)建一個(gè)ConnectionTCPClient,調(diào)用handlerIncomingConnection來處理新進(jìn)的連接.

            總結(jié):
            ConnectionTcpServer和ConnectionTcpClient的區(qū)別:
            connect (client) - 連接到服務(wù)器,使connection處于可以接收數(shù)據(jù)的狀態(tài)
            connect(server) - 綁定到本地地址,偵聽,使connection處于可以接收新連接的狀態(tài)(accept)

            recv(client) - 接收數(shù)據(jù),調(diào)用connectionDataHandler->handlerReceivedData
            recv(server) - 接收新連接,調(diào)用connectionHandler->handlerIncomingConnection

            receive(Client) - 接收數(shù)據(jù)狀態(tài),循環(huán)接收數(shù)據(jù),調(diào)用disconnect時(shí)退出
            receive(Server) - 接收連接狀態(tài),循環(huán)接收連接,調(diào)用disconnect時(shí)退出.

            所以ConnectionTcpClient有發(fā)送數(shù)據(jù)和循環(huán)接收數(shù)據(jù)的能力,ConnectionTcpServer有偵聽客戶端連接的能力。當(dāng)有特定的事件發(fā)生的時(shí)候,會(huì)自動(dòng)觸發(fā)相關(guān)的handler來進(jìn)行處理,如數(shù)據(jù)到來,連接建立\斷開,新連接到來等等。

            問題:
            這種設(shè)計(jì)模式使receive處于一個(gè)無限的while循環(huán),不斷的調(diào)用select+accpet或者select+receive,是否利于send之類的方法在同一個(gè)socket上發(fā)送數(shù)據(jù)?
                                                     

            posted on 2008-10-17 21:20 ysong.lee 閱讀(1657) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜精品久久久内射近拍高清| 国内精品久久久久影院优| 久久久久亚洲AV成人网人人软件| 国产成人精品久久一区二区三区av| 久久久久九国产精品| 天天爽天天狠久久久综合麻豆| 久久精品国产一区二区三区日韩| 久久国产精品免费| 热re99久久精品国99热| 国产三级精品久久| 亚洲精品蜜桃久久久久久| 99久久精品免费看国产一区二区三区 | 久久国产精品久久| 欧美精品福利视频一区二区三区久久久精品 | 久久久久久综合网天天| 久久亚洲AV成人无码国产| 精品久久人人做人人爽综合| 三上悠亚久久精品| 久久久这里有精品| 日韩电影久久久被窝网| 久久精品嫩草影院| 久久久久亚洲av无码专区喷水| 久久综合久久鬼色| 久久久久国产视频电影| 久久r热这里有精品视频| 久久亚洲春色中文字幕久久久| 一级a性色生活片久久无少妇一级婬片免费放 | 色欲久久久天天天综合网精品 | 99久久免费国产精品特黄| 久久精品国产一区二区三区不卡| 99久久精品国产麻豆| 青青草原精品99久久精品66| 亚洲精品无码专区久久久| 久久亚洲AV无码精品色午夜麻豆| 久久天天躁狠狠躁夜夜2020| 久久99精品久久久久久水蜜桃| 久久综合综合久久97色| 91久久成人免费| 久久99国产一区二区三区| 久久国产精品波多野结衣AV| 久久精品成人一区二区三区|