1. 程式人生 > >java遊戲伺服器必備

java遊戲伺服器必備

推薦閱讀:

      對於一個新手,想接觸遊戲伺服器,一定會有個疑問——使用Java開發伺服器需要學習什麼?

      Java語言,由於學習成本低,開發速度快,穩定性高,開源框架多,目前已成為網頁遊戲和手機遊戲伺服器開發的主要語言。咱們從系統的開發流程簡單梳理一下伺服器開發需要用到的技術。

1,網路通訊

      這個是首要實現的,如果沒有網路通訊,就沒有伺服器存在的必要了。網路通訊就需要建立網路連線。目前網路通訊有兩種方式,一種是短連線,比如http,一種是長連線,比如socket,當然http也是基於socket的,socket是通訊的基礎。所以要對tcp/ip通訊的知識有所瞭解,明白通訊的原理。
      基於這兩種網路通訊,遊戲伺服器也分為兩種,弱聯網和強聯網。弱聯網的遊戲一般是指一些小型的遊戲,比如開心消消樂,連連看,以及一些卡牌養成類遊戲,這類遊戲一般幾秒鐘或幾分鐘再會與伺服器同步一次資料,一般會使用短連線。而像一些arpg遊戲,實時戰鬥類遊戲,以及帶同屏顯示玩家的遊戲,這類遊戲與伺服器互動資訊頻繁,一秒鐘可能幾十次,會採用長連線,避免每次連線重新建立消耗系統資源,提高通訊效率。

      為了網路通訊的效率,伺服器要使用NIO(非阻塞網路通訊)通訊。它能支援大併發連線。Java NIO是多路複用IO,在多路複用IO模型中,會有一個執行緒不斷去輪詢多個socket的狀態,只有當socket真正有讀寫事件時,才真正呼叫實際的IO讀寫操作。因為在多路複用IO模型中,只需要使用一個執行緒就可以管理多個socket,系統不需要建立新的程序或者執行緒,也不必維護這些執行緒和程序,並且只有在真正有socket讀寫事件進行時,才會使用IO資源,所以它大大減少了資源佔用。目前基於此技術有很多開源框架,最常用的有兩種,Netty和Mina。

      所以在網路通訊這一塊,如果是弱聯網遊戲,可以使用web那一套來開發遊戲伺服器,需要學習的技術一般有http原理,Json格式協議,servlet,Tomcat(也可以是其它web容器),spring等。如果是強聯網遊戲,要學習的技術有Netty或Mina可以選擇一種,多執行緒以及執行緒池的應用。這是網路通訊所必須掌握的。只要能把客戶端傳送的資訊接收到,並解析成程式碼使用的明文,就是成功了一半了,剩下的事就是把程式碼封裝好,方便邏輯開發呼叫!

      通訊這塊還要考慮訊息的併發,長連線情況下,怎麼處理斷包,粘包問題,每個使用者的訊息處理的是不是有序的,如果有序會不會阻塞訊息,如果無序會不會造成處理混亂,比如後到的訊息先處理了,這些問題都要處理好,目前一般是保證同一個使用者的訊息要有序處理!

2,資料儲存

      網路通訊除錯好之後,不要急著做邏輯開發,還需要把資料如何儲存理清楚!因為伺服器端操作的全是資料,如果處理的不好,容易出bug,丟資料,這對遊戲玩家來說是致命的,不可接受的!資料儲存要考慮:
      一,資料如何存到資料庫,是同步儲存,還是非同步儲存!同步儲存即將數操作完之後立刻寫入資料庫,非同步操作即資料操作完之後先儲存到記憶體快取,然後由另外的執行緒或程序再同步到資料庫!遊戲中一般都是採用的非同步儲存方式,因為遊戲併發量大,必須低延時,快速響應客戶端!如果直接操作資料庫太慢,會造成訊息阻塞!記憶體快取可先擇的框架有redis,memcache,具體怎麼同步到資料庫,需要自己去設計了!
      二,資料介面如何設計,能不能用工作生成這些資料操作的程式碼,能不能不用寫SQL語句,需是封裝在底層,或由工具生成。程式設計是門藝術,在這就體現出來了,當然是仁者見仁,智者見智了!
      三,大併發情況下資料的一致性,像這類可能多執行緒操作的資料,一般是放在記憶體中,由鎖來控制併發!所以對鎖的使用要熟悉,不要出現死鎖,或鎖粒度過大,造成執行緒的長時間等待的情況!
      四,當資料量太大,一個數據庫儲存不了,資料該怎麼分庫分表!一種是水平劃分,一種是垂直劃分!具體的劃分方式其它資料已有詳細介紹,請自行查詢閱讀!目前有一個開源的分庫框架mycat,是用JAVA寫的,大家可以研究一下!

3,邏輯開發

      邏輯開發就是實現遊戲策劃想象的各種遊戲功能,比如,登入,物品使用,戰鬥結算等!邏輯開發程式碼量巨大,相互之間有很緊密的耦合性,所以每個功能模組一定要劃分好!最好是接觸下單元測試,寫之前考慮一下是否方便單元測試,這樣設計的程式碼會更加清晰,每個方法責任明確,不容易出bug!正是因為邏輯程式碼複雜,為了更好的管理程式碼,前輩們給我們總結了一些經驗,就是著名的設計模式,所以學習一下設計模式對程式碼的管理有很大的好處!

邏輯開發一般遇到的問題有:

3.1,資料同步

      一說到資料同步或資源共享的時候,一般都會考慮到鎖的使用。因為一份資源同時只能被一個執行緒訪問才是安全的。Java的JDK中提供了一些鎖,比如:synchronized,以及java.util.concurrent.lock包中的Lock物件,java.util.concurrent包中還提供了其它的一些原子操作的類,我們知道i++操作不是執行緒安全的,但是可以使用AtomicInteger中的getAndIncrement();方法代替,還有執行緒安全的ConcurrentHashMap哈稀Map。以及阻塞佇列LinkedBlockingQueue等。都是邏輯開發中常用的處理資料同步的類。

3.2,設計模式的使用

      使用設計模式,可以讓程式碼更加清晰,可擴充套件性更強,維護性更佳,比如,任務系統,任務會有很多種型別,要獲得任務資料時,在一開始寫這個系統的時候,我是這樣寫的if(type == 1)做什麼,else if(type == 2)做什麼,else if(type == 3)…else if(type == 35) else等。如果需要新增新的型別,又要新增else,這些if else都在同一個方法中。最後都不敢動一塊,就怕出bug。其實當一個方法中出現三個以上的if else將來還可能增加時,就應當考慮設計是不是有問題了,後來改成責任鏈模式或狀態模式,就解決了這個問題。還有一個例子是,當一個值變化,要影響多個任務完成狀態時,可以使用觀察者模式或監聽模式或訂閱模式去實現,這樣功能之間完全解耦,出問題的機率會很小很小。

3.3,資料快取框架的API使用

      目前主流使用的資料快取框架有redis和memcache,雖然在邏輯開發前,主程會對這些進行一些封裝,但是作為使用者還是需要對這些框架的客戶端的使用要有所瞭解的。這些可以去閱讀相關的文件。不是太難。

4,程式部署與執行

      目前,大多數Java專案都採用maven管理 ,可以使用maven打包開發好的程式,程式一般執行在遠端伺服器上,比如雲伺服器。一般執行Java程式的遠端伺服器都是Linux系統,需要使用Linux命令操作,或寫一些shell指令碼去自動化部署管理一些程式。

5,艱苦奮鬥的精神

      首先,一定要讓自己對這一行有興趣,明確自己在這一行的技術選擇,人生選擇。很多人都知道,程式設計師加班是常有的事,堅持的住就做,堅持不了就再換一家公司做。

綜上所述,想做Java遊戲伺服器方面的開發要掌握的技術有以下一些:

1,網路通訊框架,Mina或Netty必須熟悉一種。而且自己必須要親自搭建過,並明白其它原理。

2,通訊協議制定和處理斷包粘包,這一般屬於網路通訊框架要解決的問題。

3,資料快取框架,redis或memcache選擇一個,能熟練使用其客戶端的命令。

4,Java基礎,Java NIO通訊原理,Java集合的使用,Java多執行緒開發,Java鎖的使用

5,瞭解一些設計模式。最好能把23種設計模式都看一遍,並結合自己的開發經驗,看哪些可以用到設計模式,但也不能死套設計模式,要靈活運用。

6,熟悉使用Mysql資料庫

7,瞭解資料庫連線池的一些框架,比如Mybatis,hibernate

8,對Http協議熟悉,熟悉一種web容器,比如tomcat,瞭解其配置。

9,對常用的一些Linux命令要熟悉使用。

10,熱愛學習,不斷的充實自己,上面所說的只是入門技能而已,真正做起來要複雜的多,一定要讓自己喜歡遊戲這個行業,這樣才能有動力做下去,做自己喜歡的工作還是比為了工作要好的!
原文:https://blog.csdn.net/qq_29166327/article/details/79433018