分類: teamtalk
服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動(也不是唯一的順序):
1、啟動db_proxy。
2、啟動route_server,file_server,msfs
3、啟動login_server
4、啟動msg_server
那麼我就按照服務端的啟動順序去講解服務端的乙個流程概述。
第一步:啟動db_proxy後,db_proxy會去根據配置檔案連線相應的mysql例項,以及redis例項。
第二步:啟動route_server,file_server,msfs後,各個服務端都會開始監聽相應的埠。
第三步:啟動login_server,login_server就開始監聽相應的埠,等待客戶端的連線,而分配乙個負載相對較小的msg_server給客戶端。
第四步:啟動msg_server,msg_server啟動後,會去主動連線route_server,login_server,db_proxy,會將自己的監聽的埠資訊註冊到login_server去,同時在使用者上線,下線的時候會將自己的負載情況匯報給login_server.
下面我會分析route_server,login_server以及msg_server的一些邏輯,這裡只是簡單的分析,後面會有針對各個端的具體的分析。
首先講解下各個端的一些結構體。
route_server
route_server 在整個tt中的作用是乙個訊息**的地方,其在記憶體中維護了全域性使用者資訊。當有多個msg_server的時候,route_server的作用就是在多個msg_server之間中轉訊息。
在routeconn.cpp中定義了如下結構體用來儲存使用者狀態:
typedef maprouteconnmap_t;
typedef struct userstat_t;
typedef hash_mapuserstatmap_t;
static userstatmap_t g_rs_user_map;
g_rs_user_map是乙個hash_map,儲存了全域性使用者資訊,其定義如下,key是使用者id,value是乙個結構體:
typedef struct userstat_t;
該結構體中status標識使用者的狀態,conns也是乙個map,其儲存了對應的msg_server連線,以及該連線上使用者的是pc端還是移動端。
當又使用者上線的時候,msg_server會將該使用者的狀態傳送到route_server,route_server就會在g_rs_user_map裡面插入一條記錄。
login_server
login_server在整個tt的架構中,可以簡單的理解為乙個負載均衡的作用,在login_server中,同樣在記憶體中維護了所有的msg_server的位址以及其目前的負載情況。
在loginconn.cpp中定義了如下結構體來儲存msg_server的狀態機負載:
typedef hash_mapuserconncntmap_t;
typedef struct msg_serv_info_t;
static mapg_msg_serv_info;
g_msg_serv_info是乙個hash_map用來儲存msg_server。其key是乙個socket描述符,value儲存的是乙個結構體,包含了對應msg_server的具體資訊:
typedef struct msg_serv_info_t;
ip_addr1與ip_addr2分別儲存對應msg_server的網通和電信的ip(在這裡由於我們的伺服器是雙線所以這麼設計的),port儲存了對應msg_server的埠,max_conn_cnt儲存的是msg_server中配置的最大連線數,當msg_server的連線數超過該值後,就不在分配使用者過去,cur_conn_cnt,對應msg_server當前的連線數,cur_user_cnt儲存的是對應msg_server登陸的使用者數,就像注釋說的那樣,由於可以多點登陸,所以當前使用者數<=當前連線數,hostname儲存的是msg_server的hostname,server_type標記msg_server網路型別,目前只有乙個定義tcp server,在impduserver.h中定義:
enum ;
user_cnt_map是乙個hash_map用來儲存使用者id以及對應的使用者數量:
hash_mapuserconncntmap_t;
msg_server
額……msg_server真的是太複雜了,這個留到後面**分析的時候再說吧。
msg_server<----->login_server
msg_server 啟動後會去主動連線login_server,並通過資料報cimpdumsgservinfo向login_server註冊自己的資訊。其處理邏輯在loginservconn.cpp中:
void cloginservconn::onconfirm()
; gethostname(hostname, 256);
cimpdumsgservinfo pdu(g_msg_server_ip_addr1.c_str(), g_msg_server_ip_addr2.c_str(),
g_msg_server_port, g_max_conn_cnt, cur_conn_cnt, hostname, msg_server_type_tcp);
sendpdu(&pdu);
if (!user_conn_list.empty())
}
當有使用者連線上msg_server並登入成功或者使用者斷開連線的時候,會向login_server傳送乙個cimpduusercntupdate資料報通知login_server。其處理邏輯在loginservconn.cpp:
void send_to_all_login_server(cimpdu* ppdu)
}}
msg_server<---->route_server
void crouteservconn::onconfirm()
listonline_user_list;
cimusermanager::getinstance()->getonlineuserinfo(&online_user_list);
cimpduonlineuserinfo pdu(&online_user_list);
sendpdu(&pdu);
}
當有使用者連線上msg_server並登入成功或者使用者斷開連線的時候,會向route_server傳送乙個cimpduuserstatusupdate資料報通知route_server。其處理邏輯在routeservconn.cpp:
void send_to_all_route_server(cimpdu* ppdu)
}}
呼叫處向route_server與login_server匯報本機情況的呼叫在msgconn.cpp中,在使用者上線,下線的時候會呼叫:
void cmsgconn::senduserstatusupdate(uint32_t user_status)
cimuser* pimuser = cimusermanager::getinstance()->getimuserbyname(m_user_name);
if (!pimuser)
// 只有上下線通知才通知loginserver
if (user_status == user_status_online)
} else if (user_status == user_status_offline)
}}
TeamTalk服務端分析之服務端以及客戶端流程
原文 www.bluefoxah.org teamtalk server flow.html 服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動 也不是唯一的順序 1 啟動db proxy。2 啟動route se...
TeamTalk原始碼分析之服務端描述
ttserver teamtalk伺服器端 主要包含了以下幾種伺服器 teamtalk中用到了其他開源庫,比如google protobuf redis log4cxx等。服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端,如果相應的服務端還未啟動,會始終嘗試連線。不過在此...
HTTP服務端JSON服務端
最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...