一、 總的構架結構示意圖:
如上圖所示,目前系統總的分成六個(gè)模塊,分別為網(wǎng)絡(luò )/協(xié)議解析模塊,用戶(hù)賬號管理模塊,消息處理模塊,動(dòng)作處理模塊,數據均衡處理模塊,客戶(hù)狀態(tài)處理模塊 。
正常流程應該這么實(shí)現,以一個(gè)或者幾個(gè)線(xiàn)程運行網(wǎng)絡(luò )/協(xié)議解析模塊,然后他根據具體的包類(lèi)型分發(fā)給具體的命令處理模塊,每個(gè)具體的命令處理模塊至少應該分別運行于不同的線(xiàn)程。
從上面的結構圖可以看出,其中客戶(hù)狀態(tài)模塊和網(wǎng)絡(luò )/協(xié)議解析模塊都是公用模塊,其他的模塊幾乎都依賴(lài)于這兩個(gè)模塊。目前因為很多功能不予以實(shí)現,例如不實(shí)現離線(xiàn)消息,所以只有用戶(hù)賬號管理模塊跟數據庫相關(guān)。
二、 每個(gè)模塊的具體功能描述
1. 用戶(hù)賬號管理模塊:
該模塊管理基于用戶(hù)賬號的所有操作:具體由如下:創(chuàng )建用戶(hù),刪除用戶(hù),修改用戶(hù)資料,修改用戶(hù)密碼,得到用戶(hù)個(gè)人信息,得到好友列表,登陸,登出,請求認證串,創(chuàng )建群組,加入群組,離開(kāi)群組。
以上所有操作,除了創(chuàng )建用戶(hù)不需要登陸外,其他的任何操作都必須是已經(jīng)登陸的用戶(hù),所以必須先有登陸操作,才能進(jìn)行下一步的操作,這條規則針對所有的命令都是。
描述一下登陸過(guò)程:
客戶(hù)端發(fā)送命令請求得到認證串——〉網(wǎng)絡(luò )/協(xié)議解析模塊把客戶(hù)端請求以及它的用戶(hù)標志轉發(fā)給用戶(hù)賬號管理模塊 ——〉用戶(hù)賬號管理模塊自動(dòng)生成一個(gè)隨機認證串,同時(shí)把該客戶(hù)端的用戶(hù)標志一起保存在列表中(在列表中該數據只能保存一分鐘,超過(guò)則刪除,因此客戶(hù)端必須在一分鐘內利用此認證串登陸),同時(shí)把認證串由網(wǎng)絡(luò )/協(xié)議解析模塊發(fā)送給客戶(hù)端——〉客戶(hù)端把用戶(hù)名和認證串、用戶(hù)名、密碼組成的新串的MD5一并發(fā)給服務(wù)器請求登陸——〉網(wǎng)絡(luò )/協(xié)議解析模塊把客戶(hù)端請求以及它的用戶(hù)標志轉發(fā)給用戶(hù)賬號管理模塊——〉用戶(hù)賬號管理模塊首先檢查列表中是否有該用戶(hù)標志的數據,如果有則繼續——〉從數據庫中取出用戶(hù)名和密碼,然后從列表中取出認證串,生成MD5,看是否一致,如果一致,則表示登陸成功,服務(wù)器生成會(huì )話(huà)加密密鑰,以后的所有與服務(wù)器的會(huì )話(huà)信息都采用此密鑰加密和解密——〉網(wǎng)絡(luò )/協(xié)議解析模塊把結果發(fā)送給客戶(hù)端,如果成功——〉網(wǎng)絡(luò )/協(xié)議解析模塊把該用戶(hù)的用戶(hù)標志和會(huì )話(huà)加密密鑰保存在客戶(hù)狀態(tài)模塊中。
2. 網(wǎng)絡(luò )/協(xié)議解析模塊:
網(wǎng)絡(luò )解析模塊應該保存一個(gè)最近的登陸用戶(hù)列表的緩存,該列表保存的信息應該有IP和端口,還有加密密鑰,最后一次訪(fǎng)問(wèn)的時(shí)間。在該列表的用戶(hù),如果超過(guò)一定時(shí)間(例如一分鐘)沒(méi)有訪(fǎng)問(wèn),就要從該列表中刪除。該列表的主要用途用于快速的查找登陸用戶(hù)(這樣頻繁訪(fǎng)問(wèn)服務(wù)器的用戶(hù)登錄檢查就不需要叢客戶(hù)狀態(tài)模塊中查詢(xún)了,提高效率),如果在此列表中查找不到,則向客戶(hù)狀態(tài)模塊查找,如果找到了,則把用戶(hù)添加到此列表中。如果找不到,則表示不在線(xiàn)。
任何時(shí)候收到用戶(hù)的消息,則要更新登陸用戶(hù)列表的緩存中的最后訪(fǎng)問(wèn)時(shí)間數據,如果該用戶(hù)不在列表中,但是最后檢查已經(jīng)登陸,則要添加。還有心跳命令不應該影響該列表的用戶(hù)數據。但是心跳命令會(huì )影響客戶(hù)狀態(tài)列表。
網(wǎng)絡(luò )解析模塊應該保存一個(gè)用戶(hù)標志映射列表(也可以直接組合他們的數據地址),把客戶(hù)端的IP地址和端口映射到一個(gè)具體的唯一客戶(hù)端標志值,然后這個(gè)值以后作為這個(gè)客戶(hù)端的標志,各個(gè)具體模塊對客戶(hù)端的任何操作都以這個(gè)標志為基礎。
有四個(gè)功能
第一,根據不同的類(lèi)型把數據報解密后(如果需要解密)分發(fā)給各個(gè)具體的處理模塊。在分發(fā)前,首先檢查該用戶(hù)是否登陸,如果沒(méi)有,則直接告訴客戶(hù)端一個(gè)錯誤。對于新建用戶(hù),登陸命令,獲取認證字符串的命令不需要檢查是否已經(jīng)登陸。
第二,自己處理相關(guān)的消息,目前自己處理的消息包括心跳消息和客戶(hù)端請求建立直連的命令,還有任何數據包的格式不對或者版本不對的情況處理,則該模塊自己就處理了。
第三,把用戶(hù)發(fā)送消息時(shí)的狀態(tài)提交給客戶(hù)狀態(tài)模塊,其中包括用戶(hù)唯一標志。如果用戶(hù)在發(fā)送消息時(shí),地址已經(jīng)修改了,那么唯一標志必須保持不變,但是用戶(hù)標志列表中的用戶(hù)地址數據必須跟著(zhù)修改。
第四,包各個(gè)模塊發(fā)送給客戶(hù)端的消息加密后(如果需要)處理發(fā)送給客戶(hù)端。
3. 客戶(hù)狀態(tài)模塊:
該模塊的功能如下:
第一、 保存并操作所有當前在線(xiàn)的用戶(hù)信息,包括用戶(hù)的登陸時(shí)間,用戶(hù)標志,用戶(hù)狀態(tài)(隱身等),用戶(hù)賬號。提供給其他模塊查詢(xún)某個(gè)用戶(hù)是否登陸。
第二、 處理獲取在線(xiàn)好友的消息,如果收到此命令,則通過(guò)用戶(hù)賬號管理模塊查找該用的好友列表,同時(shí)查找當前的在線(xiàn)用戶(hù)列表,然后就得到在線(xiàn)好友列表。
第三、 處理用戶(hù)狀態(tài)改變的命令,如果收到用戶(hù)的狀態(tài)改變消息(如登錄、登出、隱身等),則查找該用戶(hù)的在線(xiàn)好友列表,然后一一通知。
第四、 如果長(cháng)時(shí)間沒(méi)有收到用戶(hù)的消息,則認為該用戶(hù)因為意外的原因而斷線(xiàn),則自動(dòng)認為登出??蛻?hù)端在沒(méi)有任何消息需要發(fā)送時(shí),會(huì )定時(shí)的向服務(wù)器發(fā)送心跳命令,告訴服務(wù)器客戶(hù)端在線(xiàn),如果連續一段時(shí)間沒(méi)有收到心跳信息,則認為用戶(hù)已經(jīng)斷線(xiàn)。
第五、 保存并操作在線(xiàn)群組信息。給其他模塊提供獲取特定群組或者場(chǎng)景中的用戶(hù)列表功能。
4. 消息處理模塊:
處理所有的消息轉發(fā),包括群消息,好友消息。
對于好友消息,該消息處理模塊首先通過(guò)客戶(hù)狀態(tài)模塊檢查好友是否在線(xiàn),如果在線(xiàn),則把好友消息發(fā)送過(guò)去,如果不在線(xiàn),則不發(fā)送。
對于群消息,如果是針對普通的群組消息,則通過(guò)客戶(hù)狀態(tài)模塊得到該群組的在線(xiàn)用戶(hù)列表,然后給每個(gè)人發(fā)送該消息,除了自己。
如果是場(chǎng)景中的公有消息,則先檢查該用戶(hù)所在場(chǎng)景的位置,然后計算出能夠聽(tīng)到該用戶(hù)的場(chǎng)景中的其他用戶(hù)的用戶(hù)列表,然后給每個(gè)人發(fā)送消息。計算的算法參考每個(gè)場(chǎng)景用戶(hù)的坐標,其中在特定場(chǎng)景中的用戶(hù)不參與運算,除非在同一個(gè)的特定場(chǎng)景中的用戶(hù)才參與運算。
注意:對于場(chǎng)景消息,如果客戶(hù)端不是以場(chǎng)景方式登錄的,那么就不能發(fā)送和接收場(chǎng)景消息。
除了以上的消息,還有廣告消息,系統消息之外客戶(hù)端可以接受外,陌生人不能互發(fā)消息,如果服務(wù)器接受到此列消息,必須忽略,不發(fā)送任何應答。
5. 動(dòng)作處理模塊:
處理所有場(chǎng)景動(dòng)作,該消息只有場(chǎng)景用戶(hù)方式登錄的才能發(fā)送和接收動(dòng)作命令。服務(wù)器接收用戶(hù)的動(dòng)作命令,計算出用戶(hù)所在的場(chǎng)景中能夠看到的人的列表,然后一一發(fā)送命令給該用戶(hù)。計算的算法參考每個(gè)場(chǎng)景用戶(hù)的坐標,其中在特定場(chǎng)景中的用戶(hù)不參與運算,除非在同一個(gè)的特定場(chǎng)景中的用戶(hù)才參與運算。
該模塊中保存有一個(gè)用戶(hù)的位置和動(dòng)作狀態(tài)表(包括是否在某個(gè)特定的場(chǎng)景里面信息),保存場(chǎng)景用戶(hù)的所在場(chǎng)景用戶(hù)的坐標和最后一次的動(dòng)作狀態(tài)信息。
場(chǎng)景用戶(hù)登錄后,位置每更新一次,都必須把該用戶(hù)所在的場(chǎng)景位置坐標發(fā)送給服務(wù)器,對于心跳信息和動(dòng)作信息不需要攜帶位置坐標數據。
6. 數據均衡處理模塊:
該模塊主要為了分布式處理,服務(wù)器負載平衡而設計,主要發(fā)出網(wǎng)絡(luò )服務(wù)器重定向的命令,對于這些命令,所有客戶(hù)端都必須處理,因為一旦服務(wù)器發(fā)出了這個(gè)命令后,就在此服務(wù)器不再保存該用戶(hù)信息了。
目前該模塊不實(shí)現。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。