前言
現在網路遊戲越來越多,絕大部分網路遊戲都是需要登入註冊這一功能的,登入註冊一般使用弱聯網,即http來實現,由於只需要請求返回資訊而不需要實時互動,所以我們選擇了弱聯網。流程
我們會通過客戶端來請求伺服器登入註冊,伺服器根據客戶端請求的型別來對資料庫進行增刪改查,並返回資料給客戶端,客戶端拿到服務端的資訊實現具體的邏輯。思路
1.我們會通過客戶端請求時間戳來同步伺服器和客戶端的時間,當我們請求登入註冊時,如果伺服器和客戶端的時間差大於乙個限定,那麼我們就不會讓這個請求滿足,這是因為我們的伺服器處理的資訊量是有限的,如果有人惡意攻擊我們的伺服器,比如發動post攻擊,一秒鐘就能請求很多次伺服器,會造成伺服器的崩潰,我們就有必要限制雙方進行通訊的時間要求,只有在有效時間內的請求才會被接受。
2.我們請求登入註冊資訊的時候需要附帶上時間戳--簽名--裝置號,時間戳上面說過了,簽名是用於身份驗證,我們通過時間戳和裝置號組成乙個簽名,然後再通過md5加密,然後傳到伺服器,伺服器會將傳來的簽名進行解密,然後將傳過來的時間戳和裝置號以相同的方式生成簽名,對比生成簽名和傳入的簽名,如果一致,身份驗證通過,這樣就可以保證我們通訊的安全。
public
retvalue
post([
frombody
]string
value)
//驗證簽名
string
signserver =
mfencryptutil
.md5(
string
.format(
":", t, deviceuniqueidentifier));
if(!signserver.equals(sign,
stringcomparison
.currentcultureignorecase))
}3.在向伺服器請求的資料中,應該包含資料型別,用來告訴伺服器需要對資料庫進行怎樣的操作。比如1001代表註冊,1002代表登入……
string
username = data[
"username"
].tostring();
string
pwd = data[
"pwd"
].tostring();
string
channelid = data[
"channelid"
].tostring();
inttype =
convert
.toint32(data[
"type"
].tostring());
4.伺服器將從資料庫獲取的資訊經過封裝傳給客戶端,這裡需要定義乙個返回資料的類,一般來說,裡面都會包含一些基本的屬性,比如:是否有錯、錯誤資訊、傳遞的資訊等
public
class
callbackargs
:eventargs
5.傳輸的形式我們一般採用json格式,在web的mvc框架中我們如果返回乙個物件,也會被自動轉化為乙個json傳回客戶端,所以我們客戶端為了形成統一,也是用json來進行傳輸,將需要的鍵值對封裝在字典中轉化為json發給伺服器,伺服器再解json獲取請求資訊。
//裝置號
dic[
"deviceuniqueidentifier"
] =deviceutil
.deviceuniqueidentifier;
dic[
"devicemodel"
] =deviceutil
.devicemodel;
long
t =deviceutil
.currservertime;
//簽名
dic[
"sign"
] =encryptutil
.md5(
string
.format(
":", t,
deviceutil
.deviceuniqueidentifier));
//時間戳
dic[
"t"] = t; 總結
在http中,我們會用到post或者get方式,但是無論哪種方式,都會有安全隱患,比如頻繁的post攻擊等等會使伺服器癱瘓,那麼我們要防止這種事情發生。時間戳和簽名讓我們將這樣的風險降至最小,然後就是http協議規定,讓通訊更有效,一般我們會結合觀察者模式,監聽收到的訊息,執行對應的方法,這樣也容易分清層次,有利於封裝和擴充套件。
網路遊戲中的網路程式設計
談談網路遊戲中的 網路 程式設計 近段時間總是有不少人問我關於完成埠模型的一些資料,很多時候其實我很鬱悶,為什麼大家會選擇使用完成埠呢?或者說很多時候他們竟為了使用完成埠,而使用windows作為網路遊戲伺服器平台,還一開口羅列出一堆使用windows平台的網路遊戲案例。有些兄弟跟我一直爭論 win...
網路遊戲中的網路程式設計 效能
談談網路遊戲中的 網路 程式設計 近段時間總是有不少人問我關於完成埠模型的一些資料,很多時候其實我很鬱悶,為什麼大家會選擇使用完成埠呢?或者說很多時候他們竟為了使用完成埠,而使用windows作為網路遊戲伺服器平台,還一開口羅列出一堆使用windows平台的網路遊戲案例。有些兄弟跟我一直爭論 win...
Unity網路遊戲程式設計學習(三)
學習 unity3d網路遊戲實戰 第二版 時的學習筆記 unity網路遊戲程式設計學習 二 比起使用非同步程式,同步程式更簡單明瞭,而且不會引發執行緒問題。只需要在阻塞方法前機上一層判斷,有資料可讀才呼叫receive,有資料可寫才呼叫send,既能實現功能,又不會卡住程式,於是給socket提供了...