青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

陳碩的Blog

Muduo 網(wǎng)絡(luò)編程示例之七:“串并轉(zhuǎn)換”連接服務(wù)器及其自動化測試

Muduo 網(wǎng)絡(luò)編程示例之七:連接服務(wù)器及其自動化測試

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

這是《Muduo 網(wǎng)絡(luò)編程示例》系列的第七篇文章。

Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

本文介紹如何使用 test harness 來測試一個具有內(nèi)部邏輯的網(wǎng)絡(luò)服務(wù)程序。

本文的代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/multiplexer

下載地址:http://muduo.googlecode.com/files/muduo-0.2.0-alpha.tar.gz SHA1 checksum: 75a09a82f96b583004876e95105c679e64c95715

 

云風(fēng)在他的博客中提到了網(wǎng)游連接服務(wù)器的功能需求(搜“練手項目”),我用 C++ 初步實現(xiàn)了這些需求,并為之編寫了配套的自動化 test harness,作為 muduo 網(wǎng)絡(luò)庫的示例。

注意:本文呈現(xiàn)的代碼僅僅實現(xiàn)了基本的功能需求,沒有考慮安全性,也沒有特別優(yōu)化性能,不適合用作真正的放在公網(wǎng)上運行的網(wǎng)游連接服務(wù)器。

功能需求

這個連接服務(wù)器把多個客戶連接匯聚為一個內(nèi)部 TCP 連接,起到“數(shù)據(jù)串并轉(zhuǎn)換”的作用,讓 backend 的邏輯服務(wù)器專心處理業(yè)務(wù),而無需顧及多連接的并發(fā)性。以下是系統(tǒng)的框圖:

multiplexer

這個連接服務(wù)器的作用與數(shù)字電路中的數(shù)據(jù)選擇器 (multiplexer) 類似,所以我把它命名為 multiplexer。(其實 IO-Multiplexing 也是取的這個意思,讓一個 thread-of-control 能有選擇地處理多個 IO 文件描述符。)

mux

(上圖取自 wikipedia,是 public domain 版權(quán))

實現(xiàn)

Multiplexer 的功能需求不復(fù)雜,無非是在 backend connection 和 client connections 之間倒騰數(shù)據(jù)。具體來說,主要是處理四種事件:

由上可見,multiplexer 的功能與 proxy 頗為類似。multiplexer_simple.cc 是一個線程版的實現(xiàn),借助 muduo 的 io-multiplexing 特性,可以方便地處理多個并發(fā)連接。

在實現(xiàn)的時候有兩點值得注意:

  • TcpConnection 的 id 如何存放?當(dāng)從 backend 收到數(shù)據(jù),如何根據(jù) id 找到對應(yīng)的 client connection?當(dāng)從 client connection 收到數(shù)據(jù),如何得知其 id ?

第一個問題比較好解決,用 std::map〈int, TcpConnectionPtr〉 clientConns_; 保存從 id 到 client connection 的映射就行。

第二個問題固然可以用類似的辦法解決,但是我想借此介紹一下 muduo::net::TcpConnection 的 context 功能。每個 TcpConnection 都有一個 boost::any 成員,可由客戶代碼自由支配(get/set),代碼如下。這個 boost::any 是 TcpConnection 的 context,可以用于保存與 connection 綁定的任意數(shù)據(jù)(比方說 connection id、connection 的最后數(shù)據(jù)到達(dá)時間、connection 所代表的用戶的名字等等)。這樣客戶代碼不必繼承 TcpConnection 就能 attach 自己的狀態(tài),而且也用不著 TcpConnectionFactory 了(如果允許繼承,那么必然要向 TcpServer 注入此 factory)。

class TcpConnection : public boost::enable_shared_from_this<TcpConnection>,
                      boost::noncopyable
{
 public:

  void setContext(const boost::any& context)
  { context_ = context; }

  boost::any& getContext()
  { return context_; }

  const boost::any& getContext() const
  { return context_; }

  // ...

 private:
  // ...
  boost::any context_;
};

typedef boost::shared_ptr<TcpConnection> TcpConnectionPtr;

對于 Multiplexer,在 onClientConnection() 里調(diào)用 conn->setContext(id),把 id 存到 TcpConnection 對象中。onClientMessage() 從 TcpConnection 對象中取得 id,連同數(shù)據(jù)一起發(fā)送給 backend,完整實現(xiàn)如下:

  void onClientMessage(const TcpConnectionPtr& conn, Buffer* buf, Timestamp)
  {
    if (!conn->getContext().empty())
    {
      int id = boost::any_cast<int>(conn->getContext());
      sendBackendBuffer(id, buf);
    }
    else
    {
      buf->retrieveAll();
    }
  }
  • TcpConnection 的生命期如何管理?由于 Client Connection 是動態(tài)創(chuàng)建并銷毀,其生與滅完全由客戶決定,如何保證 backend 想向它發(fā)送數(shù)據(jù)的時候,這個 TcpConnection 對象還活著?解決思路是用 reference counting,當(dāng)然,不用自己寫,用 boost::shared_ptr 即可。TcpConnection 是 muduo 中唯一默認(rèn)采用 shared_ptr 來管理生命期的對象,蓋由其動態(tài)生命期的本質(zhì)決定。更多內(nèi)容請參考陳碩《當(dāng)析構(gòu)函數(shù)遇到多線程──C++ 中線程安全的對象回調(diào)

multiplexer 是二進(jìn)制協(xié)議,如何測試呢?

自動化測試

Multiplexer 是 muduo 網(wǎng)絡(luò)編程示例中第一個具有 non-trivial 業(yè)務(wù)邏輯的網(wǎng)絡(luò)程序,根據(jù)陳碩《分布式程序的自動化回歸測試》一文的思想,我為它編寫了 test harness。代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/multiplexer/harness/src/com/chenshuo/muduo/example/multiplexer

這個 Test harness 采用 Java 編寫,用的是 Netty 庫。這個 test harness 要扮演 clients 和 backend,也就是既要主動發(fā)起連接,也要被動接受連接。結(jié)構(gòu)如下:

harness

Test harness 會把各種 event 匯聚到一個 blocking queue 里邊,方便編寫 test case。Test case 則操縱 test harness,發(fā)起連接、發(fā)送數(shù)據(jù)、檢查收到的數(shù)據(jù),例如以下是其中一個 test case

http://code.google.com/p/muduo/source/browse/trunk/examples/multiplexer/harness/src/com/chenshuo/muduo/example/multiplexer/testcase/TestOneClientSend.java

這里的幾個 test cases 都以用 java 直接寫的,如果有必要,也可以采用 Groovy 來編寫,這樣可以在不重啟 test harness 的情況下隨時修改添加 test cases。具體做法見陳碩《“過家家”版的移動離線計費系統(tǒng)實現(xiàn)》。

將來的改進(jìn)

有了這個自動化的 test harness,我們可以比較方便且安全地修改(甚至重新設(shè)計)multiplexer。例如
  • 增加“backend 發(fā)送指令斷開 client connection”的功能。有了自動化測試,這個新功能可以被單獨測試(指開發(fā)者測試),而不需要真正的 backend 參與進(jìn)來。
  • 將 Multiplexer 改用多線程重寫。有了自動化回歸測試,我們不用擔(dān)心破壞原有的功能,可以放心大膽地重寫。而且由于 test harness 是從外部測試,不是單元測試,重寫 multiplexer 的時候不用動 test cases,這樣保證了測試的穩(wěn)定性。另外,這個 test harness 稍作改進(jìn)還可以進(jìn)行 stress testing,既可用于驗證多線程 multiplexer 的正確性,亦可對比其相對單線程版的效率提升。

posted on 2011-05-02 19:47 陳碩 閱讀(2485) 評論(0)  編輯 收藏 引用 所屬分類: muduo

<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲在线免费视频| 久久久国产精品一区| 欧美日韩亚洲高清一区二区| 蜜桃av综合| 欧美成人嫩草网站| 欧美精品久久久久久| 欧美日韩国产在线看| 国产精品视频久久一区| 国产日韩欧美一区二区| 在线播放中文字幕一区| 9久re热视频在线精品| 亚洲欧美成人| 久久免费午夜影院| 亚洲国产精品久久久| 亚洲国产精品久久久久秋霞蜜臀| 日韩亚洲欧美在线观看| 欧美在线播放| 牛牛国产精品| 国产精品麻豆欧美日韩ww| 黑人一区二区三区四区五区| 99精品免费视频| 久久国产日韩| 亚洲裸体视频| 久久久99国产精品免费| 欧美三级中文字幕在线观看| 伊人久久大香线| 亚洲欧美激情视频| 亚洲国产精品毛片| 欧美一区二区三区免费视频| 欧美日韩成人一区二区三区| 激情视频一区二区| 欧美一级视频免费在线观看| 亚洲高清电影| 久久亚洲精品欧美| 国产美女精品免费电影| 一区二区三区你懂的| 欧美99在线视频观看| 亚洲欧美一区二区精品久久久| 亚洲宅男天堂在线观看无病毒| 日韩一级在线观看| 亚洲一区二区三区四区五区午夜| 久久综合狠狠| 国产一区二区三区av电影| 亚洲视频精选在线| 欧美黄色一级视频| 久久久美女艺术照精彩视频福利播放| 国产精品视频999| 99国产精品一区| 欧美国产日韩a欧美在线观看| 久久福利资源站| 国产曰批免费观看久久久| 午夜日韩视频| 亚洲少妇在线| 国产精品久久久久久久久久久久久久 | 欧美粗暴jizz性欧美20| 欧美一区2区视频在线观看| 国产精品国产三级国产普通话三级| 亚洲日本一区二区| 亚洲国产精品一区二区久| 久热精品在线视频| 亚洲人成人99网站| 亚洲东热激情| 欧美日韩hd| 亚洲综合精品| 亚洲男人第一网站| 国产在线观看精品一区二区三区| 久久久999精品| 久久久夜夜夜| 亚洲伦理中文字幕| 99国产精品一区| 国产精品午夜春色av| 久久久久久久欧美精品| 久久久一二三| 宅男66日本亚洲欧美视频| 亚洲视频精品| 国产一区白浆| 欧美国产在线电影| 欧美日韩国产区| 欧美一区二区在线看| 久久精品在线| 9l国产精品久久久久麻豆| 亚洲影院色在线观看免费| 狠狠色综合日日| 亚洲韩国精品一区| 国产精品久久久久91| 毛片av中文字幕一区二区| 欧美福利视频在线| 亚洲欧美中文字幕| 久久综合九色综合欧美就去吻 | 欧美日韩国产123区| 老鸭窝91久久精品色噜噜导演| 欧美精品在线观看一区二区| 国产精品久久9| 欧美成人资源| 国产精品一级二级三级| 欧美高清视频在线播放| 国产精品第三页| 六十路精品视频| 国产精品mv在线观看| 免费观看在线综合色| 国产精品久久二区二区| 欧美大片国产精品| 国产欧美韩日| 99成人在线| 亚洲国产精品久久久久秋霞不卡| 中文成人激情娱乐网| 亚洲激情视频在线播放| 欧美一区二区三区在线播放| 一区二区三区视频免费在线观看| 久久久久久有精品国产| 欧美亚洲在线视频| 欧美日韩你懂的| 亚洲高清免费视频| 在线成人h网| 久久国产日本精品| 久久动漫亚洲| 国产欧美精品日韩精品| 在线天堂一区av电影| 一本到高清视频免费精品| 美国成人直播| 女同性一区二区三区人了人一| 国产日韩精品一区二区三区在线| 日韩午夜免费| 亚洲午夜精品| 欧美日韩亚洲综合一区| 亚洲日本中文字幕| 亚洲精品在线一区二区| 欧美成黄导航| 亚洲国产精品成人久久综合一区| 在线视频国内自拍亚洲视频| 久久久久久久一区二区| 美女啪啪无遮挡免费久久网站| 国产一区亚洲一区| 久久电影一区| 免费观看在线综合色| 亚洲国产成人久久综合一区| 久久久久88色偷偷免费| 麻豆精品视频| 亚洲精品日日夜夜| 欧美另类视频| 日韩亚洲欧美在线观看| 亚洲综合色婷婷| 国产欧美欧美| 久久精品国产清自在天天线| 老司机一区二区三区| 亚洲成色www8888| 欧美r片在线| 日韩一区二区福利| 香港成人在线视频| 韩国在线视频一区| 男女精品网站| 一本久久综合亚洲鲁鲁五月天| 亚洲永久在线| 国产一区二区三区在线观看免费视频 | 久久九九国产| 久久伊人一区二区| **欧美日韩vr在线| 欧美黄色aaaa| 亚洲一区二区三区影院| 久久国产一区二区| 亚洲国产三级| 欧美色视频在线| 欧美亚洲免费电影| 欧美激情成人在线| 亚洲欧美电影院| 国产一区二区三区在线观看网站| 久久婷婷一区| 一本色道久久综合狠狠躁篇怎么玩| 午夜精品美女自拍福到在线 | 亚洲欧美色一区| 国产有码一区二区| 欧美精品一区二区三区很污很色的 | 久久精品国产99| 91久久精品国产91性色| 欧美午夜片欧美片在线观看| 久久国产精品毛片| 99精品欧美| 欧美不卡视频一区发布| 亚洲欧美国产另类| 亚洲精品一区二区三区av| 国产区在线观看成人精品| 欧美另类99xxxxx| 久久精品水蜜桃av综合天堂| 亚洲少妇自拍| 亚洲精品午夜精品| 蜜桃av噜噜一区| 欧美在线网址| 中文亚洲欧美| 99ri日韩精品视频| 亚洲电影视频在线| 国产一区在线播放| 国产精品一区二区久久久| 欧美另类极品videosbest最新版本 | 欧美三级小说| 欧美国产三区| 乱码第一页成人| 久久亚洲春色中文字幕久久久| 欧美中文在线字幕| 欧美一区=区| 午夜视频在线观看一区二区|