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

陳碩的Blog

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

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

陳碩 (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 來測試一個(gè)具有內(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ù)器的功能需求(搜“練手項(xiàng)目”),我用 C++ 初步實(shí)現(xiàn)了這些需求,并為之編寫了配套的自動(dòng)化 test harness,作為 muduo 網(wǎng)絡(luò)庫的示例。

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

功能需求

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

multiplexer

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

mux

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

實(shí)現(xiàn)

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

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

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

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

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

第二個(gè)問題固然可以用類似的辦法解決,但是我想借此介紹一下 muduo::net::TcpConnection 的 context 功能。每個(gè) TcpConnection 都有一個(gè) boost::any 成員,可由客戶代碼自由支配(get/set),代碼如下。這個(gè) boost::any 是 TcpConnection 的 context,可以用于保存與 connection 綁定的任意數(shù)據(jù)(比方說 connection id、connection 的最后數(shù)據(jù)到達(dá)時(shí)間、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,完整實(shí)現(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 是動(dòng)態(tài)創(chuàng)建并銷毀,其生與滅完全由客戶決定,如何保證 backend 想向它發(fā)送數(shù)據(jù)的時(shí)候,這個(gè) TcpConnection 對象還活著?解決思路是用 reference counting,當(dāng)然,不用自己寫,用 boost::shared_ptr 即可。TcpConnection 是 muduo 中唯一默認(rèn)采用 shared_ptr 來管理生命期的對象,蓋由其動(dòng)態(tài)生命期的本質(zhì)決定。更多內(nèi)容請參考陳碩《當(dāng)析構(gòu)函數(shù)遇到多線程──C++ 中線程安全的對象回調(diào)

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

自動(dòng)化測試

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

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

harness

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

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

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

將來的改進(jìn)

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

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

<2011年2月>
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人成在线观看网站高清| 一本久久综合亚洲鲁鲁五月天| 亚洲国产欧美一区| 国产精品美女xx| 国产精品一二| 在线观看欧美日韩国产| 亚洲毛片在线免费观看| 一区二区三区四区精品| 亚洲欧美国产精品va在线观看| 亚洲欧美中文字幕| 美女在线一区二区| 亚洲美女av网站| 亚洲精品免费一区二区三区| 亚洲最新视频在线播放| 欧美一区二区视频在线观看| 欧美岛国在线观看| 香蕉亚洲视频| 欧美四级电影网站| 国产深夜精品福利| 亚洲视频第一页| 久久综合一区二区| 在线一区欧美| 国产精品入口夜色视频大尺度 | 欧美日韩免费观看一区二区三区| 欧美视频三区在线播放| 一区在线观看| 久久影院午夜片一区| 午夜精品福利一区二区蜜股av| 欧美大尺度在线观看| 亚洲电影免费观看高清完整版在线观看 | 国产精品视频一区二区三区 | 黄色国产精品| 老司机午夜免费精品视频| 小辣椒精品导航| 国产一区二区三区久久| 欧美影院精品一区| 欧美在线免费观看视频| 国产主播精品| 男人的天堂亚洲在线| 欧美在线视频一区| 亚洲视频二区| 国产视频自拍一区| 欧美高清视频| 欧美性大战久久久久久久| 亚洲一区自拍| 欧美一区午夜精品| 在线看国产一区| 9国产精品视频| 精品电影在线观看| 日韩午夜av电影| 国语自产精品视频在线看抢先版结局 | 久久夜色精品国产亚洲aⅴ| 最新日韩在线视频| 欧美专区日韩视频| 一区二区三区四区五区视频 | 欧美黄色网络| 性高湖久久久久久久久| 欧美噜噜久久久xxx| 久久久久99| 国产精品每日更新在线播放网址| 免费亚洲一区| 精品二区视频| 香蕉成人伊视频在线观看| 亚洲免费人成在线视频观看| 六月丁香综合| 最近中文字幕日韩精品| 国产精品国产馆在线真实露脸| 牛牛影视久久网| 欧美在线free| 久久精品亚洲一区二区| 国产乱码精品| 欧美一区在线视频| 噜噜噜噜噜久久久久久91| 亚洲成人在线观看视频| 久久野战av| 日韩视频在线观看国产| 亚洲三级免费观看| 欧美精品www在线观看| 亚洲激情在线观看| 香蕉精品999视频一区二区| 国产区亚洲区欧美区| 鲁鲁狠狠狠7777一区二区| 91久久久久| 久久久久久亚洲精品杨幂换脸| 国产综合精品| 欧美日韩一区在线视频| 亚洲色诱最新| 亚洲国产日韩欧美一区二区三区| 中文日韩欧美| 亚洲激情成人网| 国产精品视频网| 欧美人在线视频| 欧美制服丝袜| 亚洲小说春色综合另类电影| 欧美1区2区3区| 久久精品二区三区| 中文欧美字幕免费| 夜夜爽99久久国产综合精品女不卡 | 一本色道久久综合亚洲精品不| 欧美三日本三级少妇三2023 | 亚洲一区二区动漫| 欧美成年人视频| 蜜桃av一区| 久久综合网hezyo| 欧美亚洲一区三区| 国产精品a级| 欧美日韩一区二区三区免费看 | 久久婷婷丁香| 久久精品麻豆| 午夜精品www| 午夜精品一区二区三区在线播放| 一区二区欧美激情| 一区二区欧美国产| 亚洲欧美国产77777| 久久久免费av| 欧美精品v日韩精品v韩国精品v| 欧美久色视频| 国产精品福利av| 国产日产精品一区二区三区四区的观看方式 | 欧美日韩亚洲综合一区| 欧美成人中文字幕在线| 欧美人妖在线观看| 国产精品系列在线| 在线日韩av| 性色av一区二区三区| 美女免费视频一区| 亚洲在线观看视频网站| 老巨人导航500精品| 欧美日韩精品在线观看| 国产一区久久| 亚洲专区一区二区三区| 欧美高清在线视频| 亚洲在线电影| 国产精品高潮呻吟视频| 亚洲第一在线| 久久另类ts人妖一区二区| 亚洲人成亚洲人成在线观看图片| 亚洲一区二区三区国产| 美女国产一区| 亚洲激情网站| 欧美gay视频| 欧美高潮视频| 午夜一区二区三区不卡视频| 国产精品美女www爽爽爽| 日韩视频在线观看一区二区| 美女主播精品视频一二三四| 亚洲小说欧美另类婷婷| 欧美视频在线免费看| 亚洲福利精品| 欧美国产日韩a欧美在线观看| 午夜在线视频观看日韩17c| 国产精品久线观看视频| 亚洲一区国产| 欧美在线免费观看视频| 国产午夜精品久久久久久久| 久久综合五月| 欧美精品成人| 久久精品一区二区三区中文字幕| 欧美一区二区三区视频在线观看| 国内欧美视频一区二区| 欧美电影免费观看高清| 欧美日韩午夜激情| 久久久久国产精品www| 麻豆freexxxx性91精品| 中文av字幕一区| 久久久精品国产免大香伊| 在线视频你懂得一区二区三区| 欧美一区二区三区免费观看视频| 亚洲大胆女人| 欧美在现视频| 性做久久久久久久免费看| 欧美成人资源网| 欧美成人亚洲成人| 国产有码一区二区| 亚洲一区综合| 亚洲欧美国产精品桃花| 欧美国产综合| 亚洲肉体裸体xxxx137| 亚洲黄色在线观看| 蜜臀99久久精品久久久久久软件| 久久国产福利| 国产喷白浆一区二区三区| 亚洲一区二区三区四区五区午夜| 日韩亚洲一区在线播放| 欧美精品在线免费| 亚洲精品欧美激情| 一本色道久久精品| 国产精品va在线播放我和闺蜜| 国产人成一区二区三区影院| 在线一区视频| 久久超碰97人人做人人爱| 国产亚洲在线| 老司机一区二区| 日韩亚洲欧美中文三级| 亚洲欧美激情一区| 韩国欧美一区| 欧美日韩国产高清| 亚洲综合成人婷婷小说| 久久高清国产| 亚洲激情小视频|