[笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
最近一直在寫游戲,幾乎沒有來寫教程了,打算放慢一下腳步,學學新東西。
那為嘛我要學FireFly呢?
?
之前我自己寫了一個網絡游戲,服務端和客戶端都自己寫,雖然運行起來沒什么大礙,但畢竟我對服務端沒什么經驗,自己寫的服務端安全性和擴展性不太行,穩定性自然也不靠譜(即使它還沒有出現問題)。
?
正好,最近FireFly這個開源的游戲服務器引擎出來了,雖然還不太完善,但是覺得還不錯,起碼我用是足夠了~無奈,FireFly的文檔和demo奇缺,雖然有幾個大項目的demo,但對于初學Python和FireFly的我來說,我更需要的是文檔以及小demo。
?
好吧,別人是免費貢獻的,我不能要求太多,現在只好自己硬著頭皮一點點研究了。
聲明:
本教程基于FireFly1.2.2版本、Python2.7版本。
本教程面向Python和FireFly初學者中的初學者(比如我)
本教程由笨木頭花心貢獻,花心?不,是用心~!
轉載請注明原文地址:http://www.benmutou.com/blog/archives/718
既然FireFly是游戲服務器引擎,那自然就是用來開發網游了,本教程的目的是使用它,不是解剖它,所以,我們最先要了解的就是,怎么創建服務端和客戶端,并且連接上。
?
1.?客戶端
為什么先寫客戶端?因為它比較簡單。
OK,上代碼(client.py):
#coding:utf8from?socket?import?AF_INET,?SOCK_STREAM,?socketif?__name__?==?'__main__':HOST?=?"localhost"??#?服務端地址PORT?=?1000?????????#?服務端端口ADDR?=?(HOST,?PORT)client?=?socket(AF_INET,?SOCK_STREAM)???#?創建socket,TCPclient.connect(ADDR)????????????????????#?連接服務器while?True:pass
這就是FireFly的最簡單的一個客戶端實現...(小若:才怪~!這明顯就是沒有用到FireFly的任何東西!)
哦呵呵呵,那當然是沒有用到FireFly的東西了,人家FireFly可是專業搞服務端的。
?
好,因為本教程面向Python初學者,稍微解釋一下代碼。
第一行,你以為我想說的是from?import?錯了~!是#coding:utf8,這是聲明代碼用的編碼格式,它有什么用?你應該反過來,沒了它會怎么樣?大家自己試試就知道了,反正沒了它我運行不了代碼,提示編碼格式的問題。
?
于是,第二行,from?import的東西,這就是導入,類似于Java的import語句以及C++的include,詳情請玩一遍Python新手指導(有中文的)~
?
然后,那個什么?if?__name__?==?‘__main__’又是什么意思?可以理解為入口函數,只要這個py文件是直接運行的,它的__name__屬性的值就是__main__。反正就是在運行這個py文件的時候開始要做的事情。
?
最后,創建socket,然后連接服務器,反正這些用的是Python的API或者是第三方庫,細節就不管了。Socket創建的方式默認大家已經有所了解(小若:不了解),哦呵呵呵,不了解的話,那怎么寫服務端呢?~度娘會幫你的~
?
2.服務端
喂,如果你覺得剛剛的客戶端有點難度的話,那恭喜你了,接下來的服務端更難了(小若:那我走了,關瀏覽器)
?
2.1?一個Python的網絡框架-Twisted
據說Twisted是一個很強大的網絡框架,用Python寫的,并且是開源的。FireFly使用了它。
我自己也還沒有深入了解,所以不深入了。
?
2.2?Service-服務
Service(服務)是一個什么東西呢?就我個人的理解,它用于處理客戶端發過來的數據,但它并不是去解析這些數據,不是去處理什么分包粘包。它只是處理邏輯,也就是數據解析后要進行的操作的判斷。
算,這些都不仔細說,以后等我研究清楚了再說,免得害人,嘿嘿。
?
2.3?LiberateFactory-協議工廠
協議工廠就是專門處理通信數據的了,按照FireFly其中一個教程帖子的說明,協議工廠主要處理如下的事情:服務端與客戶端通信的一些處理方法,包括發送數據的封裝,協議頭的封裝,tcp通信時進行分包,處理粘包問題。
?
協議工廠可以綁定一個Service服務,這樣,當數據包解析好之后,就可以傳給Service進行下一步的游戲邏輯處理。(小若:如果你覺得我已經聽懂了的話,你就繼續說,我閃人~!)
?
好,我相信大家已經蒙了。
服務端大致的流程是這樣的:
1)利用Twisted框架來處理網絡方面的事情,最直白的就是監聽端口,然后客戶端才能連上服務器
2)客戶端的數據到達時,LiberateFactory協議工廠就會開始解析
3)數據解析完了,就丟給Service服務來處理,比如是登錄請求還是戰斗請求什么的。
?
2.5?看代碼
廢話嘮叨完了,來看看代碼吧:
#coding:utf8import?osimport?sysfrom?firefly.netconnect.protoc?import?LiberateFactoryfrom?firefly.utils?import?servicesfrom?twisted.internet?import?reactorfrom?twisted.python?import?logif?os.name!='nt':#對系統的類型的判斷,如果不是NT系統的話使用epollfrom?twisted.internet?import?epollreactorepollreactor.install()if?__name__?==?'__main__':#?有了它,就能看到日志的輸出log.startLogging(sys.stdout)#?服務,我個人理解為對客戶端數據的邏輯處理service?=?services.Service("testService")#?處理數據封裝、協議頭封裝、分包、粘包處理的類factory?=?LiberateFactory();#?關于twisted的知識,暫時忽略吧,我也還沒研究,是一個Python的網絡框架reactor?=?reactor#添加服務通道factory.addServiceChannel(service)#?開始監聽端口reactor.listenTCP(1000,?factory);reactor.run()
開頭判斷NT系統的,就不管了,因為我還沒了解Twisted。
?
來看看整個服務的啟動流程:
1)?創建一個Service服務對象,參數是服務名字,自己隨便取就好
2)?創建LiberateFactory協議工廠
3)?給協議工廠添加一個服務,也就是我們上面創建的service
4)?開始監聽端口,傳入factory對象,用于處理發送過來的數據
?
好了,這是一個服務端的最基本要有的東西?,F在,大家先運行服務端,使用Eclipse作為IDE的就按Ctrl+F11,使用Python自帶編輯器的,就按F5。
于是,我們會看到類似下面的日志輸出:
2013-10-08?11:31:47+0800?[-]?Log?opened.
2013-10-08?11:31:47+0800?[-]?LiberateFactory?starting?on?1000
2013-10-08?11:31:47+0800?[-]?Starting?factory?<firefly.netconnect.protoc.LiberateFactory?instance?at?0x0000000002F4C508>
這就成功了,然后,運行客戶端,服務端會輸出以下日志:
2013-10-08?11:32:35+0800?[firefly.netconnect.protoc.LiberateFactory]?Client?0?login?in.[127.0.0.1,6297]
?
?
完美,這就是我們對FireFly的初體驗了。
?
再次聲明,我也是剛接觸FireFly和Python,請帶著批判的眼光看待本文,本文為木頭個人學習記錄,僅供參考。
總結
以上是生活随笔為你收集整理的[笨木头FireFly01]入门篇1·最简单的服务端和客户端连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java版开源的端口映射工具
- 下一篇: C语言实现累加问题