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