集群聊天伺服器整體梳理 登入業務

2021-10-09 00:10:46 字數 2906 閱讀 2819

驗證登入資訊

int id = js[

"id"

].get<

int>()

; string pwd = js[

"password"];

user user = _usermodel.

query

(id);if

(user.

getid()

== id && user.

getpwd()

== pwd)

裡面的相關方法如下

// 根據使用者號碼查詢使用者資訊

user usermodel::

query

(int id)

;sprintf

(sql,

"select * from user where id = %d"

, id)

; mysql mysql;

if(mysql.

connect()

)}}return

user()

;}

int id = js[

"id"

].get<

int>()

; string pwd = js[

"password"];

user user = _usermodel.

query

(id);if

(user.

getid()

== id && user.

getpwd()

== pwd)

成功登入後的好友列表的離線資訊

else);

}// id使用者登入成功後,向redis訂閱channel(id)

_redis.

subscribe

(id)

;// 登入成功,更新使用者狀態資訊 state offline=>online

user.

setstate

("online");

_usermodel.

updatestate

(user)

; json response;

response[

"msgid"

]= login_msg_ack;

response[

"errno"]=

0;response[

"id"

]= user.

getid()

; response[

"name"

]= user.

getname()

;// 查詢該使用者是否有離線訊息

vector vec = _offlinemsgmodel.

query

(id);if

(!vec.

empty()

)// 查詢該使用者的好友資訊並返回

vector uservec = _friendmodel.

query

(id);if

(!uservec.

empty()

) response[

"friends"

]= vec2;

}

將離線資訊從資料庫中取出,在/include/src/server/model/offlinemsgmodel.hpp中

// 返回使用者好友列表

vector friendmodel::

query

(int userid)

;sprintf

(sql,

"select a.id,a.name,a.state from user a inner join friend b on b.friendid = a.id where b.userid=%d"

, userid)

; vector vec;

mysql mysql;

if(mysql.

connect()

)mysql_free_result

(res)

;return vec;}}

return vec;

}

通過內連線將資料查詢出來

檢視群組資訊(成功登入的操作,和上面是同乙個作用域)

// 查詢使用者的群組資訊

vector groupuservec = _groupmodel.

querygroups

(id);if

(!groupuservec.

empty()

)]vector groupv;

for(group &group : groupuservec)

grpjson[

"users"

]= userv;

groupv.

push_back

(grpjson.

dump()

);} response[

"groups"

]= groupv;

} conn-

>

send

(response.

dump()

);}

可能有很多的group,所以在資料庫中查詢的時候是查詢的是含有多個組的陣列,每乙個組裡面又是乙個含有多個使用者的陣列,然後遍歷所有使用者資訊,將其封裝成乙個類似的陣列傳送給客戶端

5. id或密碼錯誤的處理

else

簡單的群聊伺服器程式設計

今天下午學習了群聊伺服器的程式設計,因為群聊伺服器需要同步執行,所以理所當然的運用到了多執行緒。把接受服務的客戶端封裝到乙個客戶端類裡面去,就可以實現群聊了。然後就是登陸操作 客戶端 伺服器 互動 就是伺服器的輸出send 和接收get 這裡再一次體現了類的封裝性,可以把send get 方法封裝到...

手寫微信群聊伺服器

1.能夠連線多個客戶端 2.客戶端長時間未響應能夠斷開節省資源 3.能夠 乙個使用者發來一條訊息,所有客戶端都可以接收 直接使用socket.socket類就可以實現,但是這樣的話我們需要自己手動寫監聽,寫accept,把accept單獨放入乙個執行緒,每連入乙個執行緒就新開闢乙個執行緒。這裡我們選...

集群伺服器

集群,英文名稱為cluster,通俗地說,集群是這樣一種技術 它將多個系統連線到一起,使多台伺服器能夠像一台機器那樣工作或者看起來好像一台機器。採用集群系統通常是為了提高系統的穩定性和網路中心的資料處理能力及服務能力。舉個例子來說,我們架設了一台www伺服器,上面構建了乙個電子商務 然而隨著時間的推...