TeamTalk服務端分析之服務端以及客戶端流程

2021-07-26 05:41:03 字數 4341 閱讀 9010

原文:www.bluefoxah.org/teamtalk/server_flow.html

服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動(也不是唯一的順序):

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服務端分析之服務端以及客戶端流程

分類 teamtalk 服務端的啟動沒有嚴格的先後流程,因為各端在啟動後會去主動連線其所依賴的服務端。不過在此,如果是線上環境,還是建議按照如下的啟動順序去啟動 也不是唯一的順序 1 啟動db proxy。2 啟動route server,file server,msfs 3 啟動login ser...

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依賴的一...