1. 程式人生 > >boost庫在工作(35)網路服務端之五

boost庫在工作(35)網路服務端之五

在前面的例子裡,只是處理每個連線發來的訊息,然後再把訊息轉回自己的那裡,跟別的連線沒有什麼關聯,這種情況只會適應一種像HTTP的那樣,只關心自己的東西。但在網路伺服器裡,最多的是跟別人有關聯的服務。比如說聊天室,就是不斷地把所有進入這個聊天室的人的訊息向所有人廣播出去,也就是每個進來的連線,把連線所有收到的內容,再向所有連線傳送出去。又如在網路遊戲的伺服器裡,當每個地圖裡走動的人,都要向所有可視範圍裡的人傳送位置訊息,這樣在別的遊戲玩家那裡就看到附近的人在走動。又比如在工業領域裡,需要管理很多裝置,每臺裝置都連線到伺服器,不斷更新自己的資料,而這些資料又要不斷向所有監控的管理客戶端傳送出去,以便讓監控客戶端顯示這些資訊出來,告之操作人員這些裝置正在處理執行什麼狀態,或者有什麼故障。在這種需求情況之下,需要一個集合來儲存所有的連線,以便其中一個連線的訊息可以向其它連線進行傳送出去。在這裡以以前的例子為基礎,再來新增一個管理所有連線的類,這樣就可以很方便地向任何連線傳送訊息了。具體的程式碼如下:

//管理所有連線類。
//軟體開發人員:蔡軍生  2013-07-28
class CAllConnect
{
public:
//新增一個連線到連線集合。
void Add(boost::shared_ptr<CConnect > pConnect)
{
     m_setConnect.insert(pConnect);
}
//從連線集合刪除一個已經失去連線。
void Delete(boost::shared_ptr<CConnect > pConnect)
{
     m_setConnect.erase(pConnect);
}
 
std::set< boost::shared_ptr<CConnect > >& GetAllConnect(void)
{
     return m_setConnect;
}
private:
std::set< boost::shared_ptr<CConnect > > m_setConnect;
};


類CAllConnect實現儲存所有連線,並且使用Add函式來新增連線到集合裡,使用Delete函式來從集合裡刪除連線,使用GetAllConnect來獲取連線集合。