如題,目前我知道的方法就是服務器接收到資料后如果為訊息則轉發資料到所有在線客戶端然后判斷是否為發給自己的資料如果是則顯示訊息,但是自己試了試,結果并不理想,求解~~~
uj5u.com熱心網友回復:
最好是給個小例子之類的 求大佬~~~uj5u.com熱心網友回復:
不用群發吧,服務器上面保存有所有用戶的資訊,以用戶ID為索引,能快速定位用戶資訊。用戶資訊,包含用戶在線狀態,每當cli連接到sever,cli主動上報一條訊息【上線】,包含自己的cliID,
用戶離線,則有兩種方式來實作連接狀態更新,與上線類似,cli上報一條離線命令【帶上自己的id,訊息格式自己設計】,
如果是服務器主動斷開連接,這時候你要通過連接去查找用戶id,自己考慮,有沒有這個必要去設計這樣的資料結構。
(服務器主動斷開某個客戶端連接的場景是什么?,比如一個連接多長時間沒有訊息往來,是否將其強行斷開,
如果客戶端因為例外,比如主機突然斷電,或者死機,此時,因為使用TCP,服務器一段時間內,根本無法感知到客戶端已經掛掉。
或者程式例外終止,這時候不會有自定義的斷開上報
作為服務器可能只是會知道連接斷開了)
~~~~~~~~~~~~~~~~~~~~
cliA ----》server-----》cliB
簡單的示例訊息頭 |from|to|time|content|
server決議出來,訊息是發給誰的,
查詢資料庫或者是你自己實作的一個哈希索引,查出cliB的資料資訊,看其是否在線
如果在線,則查出該cli所持有的連接,往該連接轉發訊息,【注意可能還要實作應用層對收到訊息的確認】
如果不在線,則服務器要負責快取該訊息,并在客戶資訊表中,每一個用戶還要對應一個信箱串列【記錄該用戶離線時有多少離線訊息,并設定上限,一個用戶最多能有多少離線訊息】 何時轉發?當有新客戶連接上來的時候,查看信箱串列,如果存在離線訊息,則發送
~~~~~~~~~~~~~~
大概說下思路,很多細節還是要你自己設計。建議使用現成的資料庫【比如mysql】。
如果要自己實作檔案存盤,和一大堆資料結構,就比較復雜,很多細節和實作需要考慮。
uj5u.com熱心網友回復:
我也好想知道uj5u.com熱心網友回復:
包頭加幾個位元組,為0廣播資料。為1~n則為轉發資料,且為連接對應編號。
服務器建立連接后,【從id池中,也可以作為在連接池中那些連接物件的一個屬性】回傳一個編號給客戶端。標識該連接id。
客戶端A在連接時上傳自己的用戶名、密碼認證自己的身份。建立連接id<-->用戶標識映射關系。 服務器查找該用戶的好友{B、C、D},找到所有好友用戶標識,檢索連接id<-->用戶標識映射關系,如果找到則向{B、C、D}發送用戶A上線訊息
uj5u.com熱心網友回復:
要自己定義一些協議,比如如何區分各個客戶端。服務端負責轉發。struct msg{
UINT64 client_id_from;
UINT64 client_id_to;
UINT msg_length;
CHAR msg[1]
};
uj5u.com熱心網友回復:
非常的感謝 思路很清晰 還有個問題就是 server收到訊息是轉發給所有客戶端讓客戶端自行判斷ID是否為自己的ID嗎
uj5u.com熱心網友回復:
這樣搞,客戶端壓力是不是太大了?在服務器端處理比較好吧
uj5u.com熱心網友回復:
轉發給所有客戶端,是不可取的。無效轉發量太大,嚴重浪費用服務器、客戶端的資源。uj5u.com熱心網友回復:
不用群發吧,服務器上面保存有所有用戶的資訊,以用戶ID為索引,能快速定位用戶資訊。
用戶資訊,包含用戶在線狀態,每當cli連接到sever,cli主動上報一條訊息【上線】,包含自己的cliID,
用戶離線,則有兩種方式來實作連接狀態更新,與上線類似,cli上報一條離線命令【帶上自己的id,訊息格式自己設計】,
如果是服務器主動斷開連接,這時候你要通過連接去查找用戶id,自己考慮,有沒有這個必要去設計這樣的資料結構。
(服務器主動斷開某個客戶端連接的場景是什么?,比如一個連接多長時間沒有訊息往來,是否將其強行斷開,
如果客戶端因為例外,比如主機突然斷電,或者死機,此時,因為使用TCP,服務器一段時間內,根本無法感知到客戶端已經掛掉。
或者程式例外終止,這時候不會有自定義的斷開上報
作為服務器可能只是會知道連接斷開了)
~~~~~~~~~~~~~~~~~~~~
cliA ----》server-----》cliB
簡單的示例訊息頭 |from|to|time|content|
server決議出來,訊息是發給誰的,
查詢資料庫或者是你自己實作的一個哈希索引,查出cliB的資料資訊,看其是否在線
如果在線,則查出該cli所持有的連接,往該連接轉發訊息,【注意可能還要實作應用層對收到訊息的確認】
如果不在線,則服務器要負責快取該訊息,并在客戶資訊表中,每一個用戶還要對應一個信箱串列【記錄該用戶離線時有多少離線訊息,并設定上限,一個用戶最多能有多少離線訊息】 何時轉發?當有新客戶連接上來的時候,查看信箱串列,如果存在離線訊息,則發送
~~~~~~~~~~~~~~
大概說下思路,很多細節還是要你自己設計。建議使用現成的資料庫【比如mysql】。
如果要自己實作檔案存盤,和一大堆資料結構,就比較復雜,很多細節和實作需要考慮。
非常的感謝 思路很清晰 還有個問題就是 server收到訊息是轉發給所有客戶端讓客戶端自行判斷ID是否為自己的ID嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58157.html
標籤:C++ 語言
上一篇:我這個for陳述句有什么問題嗎?錯誤提示是無法定義i
下一篇:配置VSCODE 包含路徑的問題
