真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Teamtalk登錄流程詳解,客戶端和服務(wù)器交互流程分析-創(chuàng)新互聯(lián)

提示:要學(xué)習(xí)客戶端和服務(wù)器如何交互, 就是去找它們通信協(xié)議中對(duì)應(yīng)命令發(fā)送過程。 對(duì)于登錄過程,對(duì)應(yīng)登錄命令就是去分析CID_LOGIN_REQ_USERLOGIN

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括蒙陰網(wǎng)站建設(shè)、蒙陰網(wǎng)站制作、蒙陰網(wǎng)頁制作以及蒙陰網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,蒙陰網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到蒙陰省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!客戶端登錄模塊

客戶端工程一共包含十個(gè)項(xiàng)目
在Moudles項(xiàng)目下的 Login文件夾中找到LoginDialog.cpp(有一個(gè)_DoLogin()函數(shù)) ;在TcpClient文件夾中找到 TcpClientModule.cpp(有一個(gè)doLogin()函數(shù)),
這兩個(gè)是最關(guān)鍵的步驟,在_DoLogin(),可以看到

還記得客戶端的配置嗎?
http://127.0.0.1:8080/msg_server

下邊這個(gè)函數(shù)的調(diào)用就是發(fā)起http請(qǐng)求的意思
在LoginDlg.cpp 200行處
module::getHttpPoolModule()->pushHttpOperation(pOper);

當(dāng)Login_server服務(wù)器處理了這條http請(qǐng)求(若成功,會(huì)將分配給你的msg_server服務(wù)器的ip,port, name等信息以json串的格式返回給你)

在LoginDlg.cpp 207行處
module::TTConfig* pCfg = module::getSysConfigModule()->getSystemConfig();
TTConfig對(duì)象就保存了服務(wù)器返回的msg_server信息(ip, port等)

在上邊我們已經(jīng)得到http請(qǐng)求的回應(yīng),此時(shí)我們已經(jīng)有了
在LoginDlalog.cpp中213行可以看到創(chuàng)建了一個(gè)LoginOperation(繼承自ICallbackOpertaion)對(duì)象,通過startOperation()將這個(gè)對(duì)象當(dāng)作一個(gè)任務(wù)放入了一個(gè)list待執(zhí)行隊(duì)列中, 并為它注冊(cè)了一個(gè)回調(diào)函數(shù)(不只是登錄模塊是這樣,其他的任務(wù)也是以繼承ICallbackOpertaion類的方式, 將其子類實(shí)例化對(duì)象放入這個(gè)list鏈表中,只是這里是LoginOperation這種子類。)
如下:

LoginOperation* pOperation = new LoginOperation(		//去看它的實(shí)現(xiàn), 調(diào)用了_DoLogin
			BIND_CALLBACK_1(LoginDialog::OnOperationCallback), loginparam);
		imcore::IMLibCoreStartOperation(pOperation);

在上邊我們只是將登錄任務(wù)放進(jìn)了待執(zhí)行隊(duì)列,那么在哪里調(diào)用呢?

在LoginOperation.cpp中48行可以看到doLogin在這里被調(diào)用(doLogin里面可以找到發(fā)送CID_LOGIN_REQ_USERLOGIN命令的語句)。

先獲取msg_server的ip,port信息,在TTConfig結(jié)構(gòu)體內(nèi)可以查看
module::TTConfig* pCfg = module::getSysConfigModule()->getSystemConfig();
IM::Login::IMLoginRes* pImLoginResp = (IM::Login::IMLoginRes*)module::getTcpClientModule()
		->doLogin(server, pCfg->msgServPort,m_loginParam.csUserName,m_loginParam.password);

doLogin是在processOpertion中調(diào)用的,processOpertion是一個(gè)重寫的函數(shù), 不同的Operation類(這里是LoginOperation)對(duì)應(yīng)著不同功能的processOpertion,可以把它理解為去執(zhí)行任務(wù)(這里指登錄任務(wù))

這里要明白,發(fā)送消息的前提是建立了連接,doLogin函數(shù)中的第一行就是建立連接過程,這個(gè)連接和最開始的http連接獲取msg_server不一樣, http請(qǐng)求是客戶端去連接的Login_server,為了獲取msg_server信息, 而這次是客戶端與msg_server建立連接。

TcpClientModule_Impl.cpp 148行
IMLibCoreConnect(util::cStringToString(linkaddr), port);

簡(jiǎn)單的理解當(dāng)你點(diǎn)擊登錄按鈕,會(huì)觸發(fā)_DoLoing()需要做兩件事, 先發(fā)送http消息請(qǐng)求,Login_server服務(wù)器返回給你msg_server服務(wù)器信息(ip,port,name),后在doLogin()中去連接msg_server進(jìn)行一系列的信息驗(yàn)證過程。

服務(wù)器接收模塊

主要分析, 在哪接收客戶端的請(qǐng)求,以及如何為這條連接做負(fù)載均衡(將這條連接放到負(fù)載最小的msg_server上)。

客戶端的請(qǐng)求包含了兩部分,第一部分是http請(qǐng)求(用Login_server來接收處理, 目的是給客戶端找一個(gè)msg_server), 第二部分是具體的命令發(fā)送如:CID_LOGIN_REQ_USERLOGIN(用第一步找到的msg_server來接收處理)

抓住主線:
一:在Login_server中接受客戶端的http連接

http://127.0.0.1:8080/msg_server

Login_server服務(wù)器將負(fù)載最小的msg_server服務(wù)器信息(ip,port等)以json格式返回給客戶端。
二:然后客戶端再去連接這個(gè)msg_server, 說白了,Login_server只是一個(gè)中轉(zhuǎn)站,msg_server才是與客戶端一直交流的主要服務(wù)器。

首先在longin_server.cpp找, 在118行,我們可以看到longin_server.cpp通過netlib_listen監(jiān)聽了3個(gè)端口, 其中的HttpPort(也就是8080端口,就是負(fù)責(zé)處理登錄連接的第一步,處理http請(qǐng)求消息, 登錄連接的第二步是與msg_server交互)

netlib_listen就是封裝了listen過程,將這個(gè)監(jiān)聽套接字(fd)注冊(cè)到了epoll_wait()中,并且設(shè)置了回調(diào)函數(shù)(http_callback第49行),對(duì)比我們以往的C語言編程思維,因?yàn)門eamtalk是C++寫的,它將所有的套接字(fd)都封裝成了一個(gè)CBaseSocket對(duì)象,并且將這個(gè)對(duì)象通過map映射在hash表中保存,fd作為key,CBaseSocket對(duì)象作為value 當(dāng)客戶端點(diǎn)擊登錄的時(shí)候, 就會(huì)觸發(fā)消息,所以我們需要去找epoll_wait() 在哪,在EventDispatch.cpp中的354行可以找到,當(dāng)fd有消息的時(shí)候,通過我們剛剛說的那個(gè)hash映射表,因?yàn)閗ey是fd, 我們就可以找到對(duì)應(yīng)的CBaseSocket對(duì)象進(jìn)行一系列處理(Read, Write等)。

登錄第一步處理http連接(在login_server上)

當(dāng)客戶端點(diǎn)擊登錄后(_DoLogin), 服務(wù)器的HttpPort(也就是8080端口)對(duì)應(yīng)的監(jiān)聽fd 被觸發(fā),這里一定要明白,客戶端點(diǎn)了登錄按鈕后,涉及了兩個(gè)步驟,先是發(fā)送http請(qǐng)求來向Login_server服務(wù)器獲取負(fù)載最小的msg_server服務(wù)器的信息(ip,port), 所以首先討論的是Login_server處理http請(qǐng)求。 通過監(jiān)聽fd找到對(duì)應(yīng)的CBaseSocket對(duì)象,進(jìn)一步調(diào)用pSocket->OnRead(); 在OnRead中可以看到_AcceptNewSocket,它的功能就是將這個(gè)客戶端點(diǎn)擊登錄的連接接收,分配一個(gè)CBaseSocket對(duì)象與之(客戶端點(diǎn)擊登錄的連接)綁定,放到全局hash映射表中,并注冊(cè)到epoll_wait的隊(duì)列中,在這個(gè)函數(shù)(_AcceptNewSocket)的最后一行可以看到m_callback(m_callback_data, NETLIB_MSG_CONNECT, (net_handle_t)fd, NULL), 這個(gè)m_callback就是一開始為監(jiān)聽fd注冊(cè)的http_callback函數(shù)(在longin_server.cpp中的49行)
這里一定不要搞混了,這個(gè)http_callback和上邊提到的pSocket->OnRead()完全不是一個(gè)東西, 可以把pSocket->OnRead()理解為宏觀的所有套接字的統(tǒng)一接口,而http_callback才是對(duì)應(yīng)的套接字(這里指這個(gè)監(jiān)聽fd)的具體回調(diào)函數(shù)。 接著進(jìn)入http_callback 中可以知道,我們?yōu)檫@條新的登錄連接(http連接)注冊(cè)了回調(diào)函數(shù)httpconn_callback。 (這里也一定要明白,到這里我們只是接受了http的連接, 還并沒有處理http消息,一定要有清晰的邏輯,所有的處理前提都是先建立tcp連接)
至此我們已經(jīng)成功的接受了這條連接,并且設(shè)置了這條連接的回調(diào)函數(shù),并將新連接的fd(http請(qǐng)求的連接)加入到了epoll_wait的隊(duì)列中,重點(diǎn):此時(shí)我們還沒有處理客戶端發(fā)送過來的 http://127.0.0.1:8080/msg_server, 當(dāng)收到這條信息時(shí), epoll_wait觸發(fā)fd(客戶端點(diǎn)擊登錄的連接),通過全局hash找到這條連接的CBaseSocket對(duì)象,調(diào)用pSocket->OnRead(), 在OnRead中可以看到,這次并不是進(jìn)入的_AcceptNewSocket, 而是直接走的下邊的回調(diào)函數(shù)m_callback, 此時(shí)這條連接(客戶端點(diǎn)擊登錄的連接)的回調(diào)函數(shù)是httpconn_callback(在HttpConn.cpp中36行),通過fd找到對(duì)應(yīng)的連接,注意這里不是CBaseSocket連接,仔細(xì)的朋友可以發(fā)現(xiàn)每個(gè)fd都綁定了兩個(gè)對(duì)象,一個(gè)是CBaseSocket對(duì)象, 另一個(gè)是Conn對(duì)象 , 進(jìn)一步調(diào)用pConn->OnRead(); ,這個(gè)OnRead和前邊說的pSocket->OnRead()不是同一個(gè), 在這個(gè)OnRead中我們可以找到 _HandleMsgServRequest(url, content); 這個(gè)函數(shù)中尋找負(fù)載最小的msg_server并將信息(ip,port)以json格式返回給客戶端
至此 登錄過程的第一步已經(jīng)完成,我們已經(jīng)成功將負(fù)載最小的msg_server信息返回給客戶端了

登錄第二步處理客戶端登錄請(qǐng)求(在msg_server上)

本文主要學(xué)習(xí)整體流程, 在msg_server上涉及了數(shù)據(jù)庫(kù)服務(wù)器對(duì)客戶端的登錄信息進(jìn)行驗(yàn)證,暫不深究。 msg_server上和Login_server一樣,當(dāng)有客戶來連接的時(shí)候(tcp連接過程),會(huì)給這個(gè)客戶fd綁定一個(gè)CBaseSocket對(duì)象,和一個(gè)Conn對(duì)象(Login_server上是CLoginConn對(duì)象,msg_server是MsgConn對(duì)象)。

當(dāng)客戶端發(fā)送CID_LOGIN_REQ_USERLOGIN命令,epoll_wait觸發(fā),pSocket->OnRead();

pSocket->OnRead();
m_callback(); //Login_server和msg_server都是一樣的接口imconn_callback函數(shù)
//在imconn_callback中
pConn->OnRead();	//
//進(jìn)入OnRead,可以看到
HandlePdu(pPdu);
//Login_server和msg_server不是同一個(gè)pConn,并且它們都重寫了HandlePdu(pPdu)函數(shù),所以有不同的實(shí)現(xiàn)
//在MsgConn.cpp中282行,即可看到對(duì)于CID_LOGIN_REQ_USERLOGIN命令的處理。
case CID_LOGIN_REQ_USERLOGIN:
      _HandleLoginRequest(pPdu );
以上就是客戶端點(diǎn)擊登錄按鈕, 一直到服務(wù)器處理好對(duì)應(yīng)連接的全過程。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


分享標(biāo)題:Teamtalk登錄流程詳解,客戶端和服務(wù)器交互流程分析-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/dcehds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部