客戶端部分,暫時就寫到這裡,因為本文主要講述的是伺服器的那些事。
進入伺服器部分的分享前,我們先一起來回顧一些做遊戲伺服器開發所需要的一些基礎知識,以方便對後文加深理解。
什麼是網路協議呢?
網路協議就是為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
標題裡的c/s是指client,server的簡寫,本文中,以後再遇到c均指訊息的傳送者,s為接收者,他們可能乙個是客戶端,乙個是服務端,也可能是兩個服務端相互間通訊。
tcp,udp,http,telnet,websocket,tlsv……等等等等,諸如此類的協議,我都把它們稱作公有協議。
下面是一張tcp/ip協議族的圖
上面圖中,各協議到底是什麼鬼,請自行學習,不在本文介紹範圍。並且理解本文後續內容,僅需要知道協議是什麼東西即可。
一般而言,所謂的私有協議,是我們利用公有協議,在它們基礎上,進一步對資料報進行的描述和約定。
當網路上的c通過tcp/ip協議發了乙個完整的資料報給s,那麼s怎麼知道該資料報多大,每個位元組代表的是什麼含義呢?
以特定位元組標識結尾,開頭指明行為,類似keycode
固定資料報長度,不足補齊
動態長度,資料報長度放在包頭
第一種情況,當s接到資料報後,從裡面讀取資料,一直讀到某位元組的值是約定的位元組標識停止,當做乙個完整的資料報來使用,該特定位元組可能是'\n'、'\t'等等。
第二種情況,c和s就直接約定好,說我們業務不繁瑣,乾脆簡單粗暴點,我發給你的每乙個資料報的長度,都是32位元組。那麼s就可以把收到c發來的資料報,每讀32個位元組,就當做乙個完整的資料報來解析。
第三種情況就要靈活強大得多了,c和s約定好,每個資料報最初的兩個位元組,來存放資料報的長度。當s拿到資料後,首先做的就是先讀兩個位元組,來得到資料報的長度,再向後面讀到指定長度的位元組。
以上的1,3情況比較常見。
只需大體了解,無需細看
fin:1位,用於描述訊息是否結束,如果為1則該訊息為訊息尾部,如果為零則還有後續資料報;
rsv1,rsv2,rsv3:各1位,用於擴充套件定義的,如果沒有擴充套件約定的情況則必須為0
opcode:4位,用於表示訊息接收型別,如果接收到未知的opcode,接收端必須關閉連線。
mask:1位,用於標識payloaddata是否經過掩碼處理,客戶端發出的資料幀需要進行掩碼處理,所以此位是1。資料需要解碼。
payloaddata的長度:7位,7+16位,7+64位
如果其值在0-125,則是payload的真實長度。
如果值是126,則後面2個位元組形成的16位無符號整型數的值是payload的真實長度。
如果值是127,則後面8個位元組形成的64位無符號整型數的值是payload的真實長度。
當c想要發資料給s時,傳送緩衝區滿了,此時,底層會把乙個完整的資料報拆成多個資料報傳送給s,這時對s而言,接收到的資料報就有多個。可能存在下圖的多種情況。
資料報到達了b後,接下來會發生什麼情況呢?
一般而言,都會有乙個監聽程序,通過約定好的協議,講資料報解開,然後把該資料報丟給指定的處理模組。
關於資料報到達伺服器後所發生的事情,有乙個程式設計師的童話:
有乙個大怪物,守在一座山前,山上有很多山洞,每個洞口都有乙個小怪獸。大怪物把來到自己面前的人類抓起,甩給身後擁有不繁忙小怪獸的山洞,該小怪獸會把人類進行洗剝乾淨,然後根據肉質型別,丟給山的另一面的對應的怪獸進行進一步處理。
在很久很久之前,這些都要我們自己搞定。
s通過資料報中解析出兩個位元組的長度,讀取完整的資料報,再讀取兩個位元組的模組id,再把資料丟給相應的模組,該模組再按照和前端的約定,後面是什麼型別的,讀取幾個自己,代表什麼含義,just so so……
後端程式設計師定好協議,然後寫出文件,表明每個欄位的型別,丟給前端程式設計師,前端程式設計師按照該文件去寫封包或者解包**(有的資料報是服務端發給前端的)
幸運的是,現在我們不這麼做了。
ok,至此,我們的服務端已經可以接收到我們服務端程式設計師,需要處理的資料了。
開發那些事
記錄下想法。對於軟體開發,絕大多數情況下,乙個優秀的專案,離不開乙個優秀的團隊。軟體開發的流程會很大程度上決定開發的效率。很大一部分也和企業文化 團隊氣氛有關。我說下自己的體會。嚴謹的開發流程,詳細文件還有積極的溝通是至關重要的。1.專案管理工具。團隊需要乙個內部wiki或者專案管理工具開記錄工作報...
團隊遊戲的那些事
本文由作者周巧芬授權網易雲社群發布。在紛繁的工作中,我們習慣了按部就班的討論,習慣了一場場了無終結的爭論,也習慣了每次會議後疲憊的散會。但其實工作中也可以有各種有趣的方式來做這些事,更有趣也更有效的達成我們的目的。沒錯,那就是遊戲。遊戲是個利器,利用好,可以幫助我們開拓並有效達成結論。作為專案經理,...
合作開發那些事
轉眼我大學的最後乙個暑假結束了,回想這個暑假似乎沒有完成什麼任務,最主要的事就是合作開發。之前寫過關於合作開發的準備工作,現在專案基本完成了,就讓我再說說合作開發那些事兒吧!一 我的團隊 說到團隊,我要感謝我的兩位隊友了,剛哥和康康同學。雖然我是組長但是我做的並不是很好,首先我的畫的圖出現了太多的拼...