日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求

發布時間:2024/3/12 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好,經過上一篇不權威的講解,大家已經能輕易地讓客戶端和服務端連接起來了。

?

但是,僅僅是連接了,可它們倆不說話不交流,那游戲就玩不起來了,玩不起來那我就賺不到錢..啊不是,玩不起來那玩家就不能開心了,錢是…啊不!玩家是最重要的嘛~不能讓玩家不開心(小若:好好好,看出來了,錢是最重要的是吧)

?

好~!這次木頭就和大家一起見證客戶端和服務端的第一次交談吧~!

?

聲明:

本教程基于FireFly1.2.2版本、Python2.7版本。

本教程面向Python和FireFly初學者中的初學者(比如我)

本教程由笨木頭花心貢獻,花心?不,是用心~!

轉載請注明原文地址:http://www.benmutou.com/blog/archives/727

?

1.?Pythone?struct模塊

Struct模塊主要是用來對數據進行打包和解包的,和LiberateFactory不一樣,LiberateFactory已經說了,是協議工廠,當然就主要是對協議進行封裝和解析。而struct是對更底層的數據操作,是把數據打包成二進制的形式,然后在網絡中傳輸。解包也一樣,把二進制形式的數據解包成Pythone需要或者說比較好識別的格式。

反正,總之,struct模塊是對數據進行打包和解包的,解釋完畢~

?

2.?可以發送請求的客戶端(client.py)

我們要修改客戶端,以便它可以發送數據給服務端。

#coding:utf8''' Created on 2013-10-8@author: 笨木頭_鐘迪龍 www.benmutou.com '''from socket import AF_INET, SOCK_STREAM, socket import struct def sendData(sendstr, commandId): HEAD_0 = chr(0) # 協議頭0 HEAD_1 = chr(0) # 協議頭1 HEAD_2 = chr(0) # 協議頭2 HEAD_3 = chr(0) # 協議頭3 ProtoVersion = chr(0) # 協議頭版本號 ServerVersion = 0 # 服務器版本號 sendstr = sendstrdata = struct.pack('!sssss3I', HEAD_0, HEAD_1, HEAD_2, HEAD_3,\ ProtoVersion, ServerVersion, len(sendstr) + 4, commandId)senddata = data + sendstr return senddataif __name__ == '__main__': HOST = "localhost" # 服務端地址 PORT = 1000 # 服務端端口 ADDR = (HOST, PORT)client = socket(AF_INET, SOCK_STREAM) # 創建socket,TCP client.connect(ADDR) # 連接服務器 client.sendall(sendData('hello server', 1))# 發送數據給服務器 while True: pass

覺得復雜嗎?其實就多了一個sendData函數而已。(小若:但是它很復雜!)

?

2.1?協議頭部信息

我們先來解釋一下協議頭、協議頭版本號、服務器版本號。我也沒有深入了解,但就這么看,我唯一能想到的就是:這些東西是用來檢測客戶端和服務端是否同步的。

?

經過我“深入”FireFly源碼之后,發現了確實有這么一個用途,當服務端的協議工廠接收到數據時,會先判斷這些協議頭和版本號是否正確,不正確的話,是不會往下繼續執行的。

由于這是入門教程,就不一層層地貼這些代碼了,也不繼續深入了,因為它不是本文的重點。

?

重點是struct的pack函數,大家可以看看這篇文章:

http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html

只看第1、2點就暫時夠用了。

?

于是,上面代碼里的pack函數就是把4個協議頭、協議頭版本號、服務器版本號、發送的數據長度、命令碼打包。

這樣打包后的數據作為一個數據的頭部信息,顧名思義,頭部信息就是記錄一次發送數據的主要信息,比如長度、版本、命令碼。(小若:廢話!上面都說了把這些東西打包了)

?

然后我們看看這句代碼:senddata?=?data?+?sendstr。

為什么發送的數據字符串不需要參與打包呢?我也很白癡地試了一下把數據字符串也一起參與打包,結果是一樣的。

于是,據我所知,字符串可以直接傳輸(字節流),不需要再進行什么打包了。

?

2.2?發送數據

客戶端要發送數據給服務端很簡單:client.sendall(sendData(‘hello?server’,?1))

這句代碼的意思是,發送字符串‘hello?server’給服務端,命令碼是1。

結合之前說的,命令碼1會參與到數據頭部信息一起打包,而字符串’hello?server’是直接和打包后的數據連接的,不需要參與打包。

?

2.3?為什么數據長度要+4?

不知道大家會不會有個疑問,就是打包的時候這個參數:len(sendstr)?+?4

為什么長度要+4,木頭我是弄不明白了,我查看了源碼,在解析頭部信息的時候,獲取數據長度值時,又減去了4。這看起來有點多此一舉,據我目前的研究,還沒法知道原因,希望高手支招。

?

3.?可以接收請求的服務端(server.py)

服務端的改動也很小,看代碼:


#coding:utf8 ''' Created on 2013-10-8@author: 笨木頭_鐘迪龍 www.benmutou.com '''import os import sysfrom firefly.netconnect.protoc import LiberateFactory from firefly.utils import services from twisted.internet import reactor from twisted.python import logif os.name!='nt':#對系統的類型的判斷,如果不是NT系統的話使用epoll from twisted.internet import epollreactor epollreactor.install()def command_1(_conn, data): print '我跟你說,別以為你的命令碼正確了,我只是不想讓你錯誤而已~!' print dataif __name__ == '__main__': # 有了它,就能看到日志的輸出 log.startLogging(sys.stdout)# 服務,我個人理解為對客戶端數據的邏輯處理service = services.CommandService("testService")# 添加一個命令碼處理service.mapTarget(command_1)# 處理數據封裝、協議頭封裝、分包、粘包處理的類factory = LiberateFactory();# 關于twisted的知識,暫時忽略吧,我也還沒研究,是一個Python的網絡框架reactor = reactor#添加服務通道factory.addServiceChannel(service)# 開始監聽端口reactor.listenTCP(1000, factory);reactor.run()

最明顯的是多了一個command_1函數,這個函數就是用來處理命令碼為1的請求的,怎么處理?大家還記得service吧?Service就是用來處理這些請求邏輯的。

?

看看下面這兩句新增的代碼:

#?服務,我個人理解為對客戶端數據的邏輯處理

????service?=?services.CommandService(“testService”)

????#?添加一個命令碼處理

????service.mapTarget(command_1)

?

首先,我們把Service改為了CommandService,這就說明了兩個問題。第一,CommandService是專門用來處理命令碼這種類型請求的服務;第二,Service是可以自定義的,這樣就可以按我們的需要進行自定義處理,而CommandService就是其中一個自定義的服務。

?

然后,我們只要用service的mapTarget函數就能給service新增一個處理邏輯,在這里我們就說是添加了一個命令碼的處理。

這里把函數命名為command_1是有講究的,mapTarget會把下劃線’_’后面的數值作為key值,函數對象作為value值,保存起來。當客戶端發來請求時,就會根據命令碼找到對應的函數對象。

?

怎么樣?服務端就是這么處理的命令碼的,很簡單吧,具體的代碼我就不貼了,因為本文是點到即止的入門教程。

?

4.?試驗一下

大家現在就運行服務端,然后運行客戶端,如果能看到類似以下的日志,那么就恭喜你了,你成功了:

2013-10-08?22:43:59+0800?[-]?Log?opened.

2013-10-08?22:43:59+0800?[-]?LiberateFactory?starting?on?1000

2013-10-08?22:43:59+0800?[-]?Starting?factory?<firefly.netconnect.protoc.LiberateFactory?instance?at?0x0000000002FEA588>

2013-10-08?22:44:02+0800?[firefly.netconnect.protoc.LiberateFactory]?Client?0?login?in.[127.0.0.1,20708]

2013-10-08?22:44:02+0800?[LiberateProtocol,0,127.0.0.1]?call?method?command_1?on?service[single]

2013-10-08?22:44:02+0800?[LiberateProtocol,0,127.0.0.1]?我跟你說,別以為你的命令碼正確了,我只是不想讓你錯誤而已~!

2013-10-08?22:44:02+0800?[LiberateProtocol,0,127.0.0.1]?hello?server

?

5.?再來串一遍

如果你是一個正常的、正宗的、不是假冒的初學者,那么,你現在一定是這樣一種狀態:代碼運行成功了,結果也正確了,好像知道了是怎么回事了,但是又沒辦法把整個流程順暢地回憶起來。

?

那就對了,我們把客戶端發送數據到服務端接收并處理數據的流程再過一遍,這樣就清楚了:

1)?客戶端發送數據:?client.sendall(sendData(‘hello?server’,?1))

2)?發送數據之前先把4個協議頭、協議頭版本號、服務器版本號、數據長度+4、命令碼打包,然后再加上數據字符串’hello?server’,整個要發送的數據就準備好了,然后發送,至于怎么發送的,我們不管,這是socket的事情。

3)?經過某些未知的步驟,我們的數據來到了LiberateFactory協議工廠,它負責解析數據,把命令碼和數據內容拆分好,然后傳給CommandService對象

4)?CommandService根據命令碼找到對應的函數,然后執行函數

5)?完成。

?

當然,也許中間有某些步驟被我不經意間忽略了(也許是故意的,也許是能力問題),不過,作為初步了解客戶端和服務端的通信過程,也已經足夠了。

?

再次聲明,我也是剛接觸FireFly和Python,請帶著批判的眼光看待本文,本文為木頭個人學習記錄,僅供參考。


總結

以上是生活随笔為你收集整理的[笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩日激情视频 | 天天爽天天摸 | 五月婷婷综合在线 | 日韩视频国产 | 波多野结衣中文字幕在线播放 | 720url在线观看免费版 | 亚洲色图第三页 | 精品视频大全 | 亚洲精品国产精品国自产在线 | 男人天堂2020| 男女激情四射网站 | 轻点好疼好大好爽视频 | 午夜性剧场 | 亚洲人成电影网 | 欧美日韩一级片在线观看 | 男人的天堂久久久 | 黄色片在线看 | 成人黄色激情网 | 日韩中文字幕不卡 | 第四色视频 | 中文字幕在线视频播放 | 亚洲国产一区二区在线 | 第一毛片 | 成人网站免费观看入口 | 佐佐木明希av在线 | 手机av网址 | 国产精品拍拍 | 秋霞国产精品 | 精品国产一区二区不卡 | 欧美日韩免费观看视频 | 欧美一级网址 | 成人毛片软件 | www.com毛片| 处破痛哭a√18成年片免费 | 一级不卡 | 国产情侣一区二区 | 免费视频久久久 | 午夜三级在线 | 色哒哒影院 | 国产69精品久久久久777 | 男生尿隔着内裤呲出来视频 | 男女黄床上色视频免费的软件 | 日本三级视频在线 | av手机在线免费观看 | 操操操影院| 欧美综合久久 | 青青草久| 国产jzjzjz丝袜老师水多 | 欧美成人乱码一二三四区免费 | 日韩激情视频在线观看 | 对白刺激国产子与伦 | 中国女人裸体乱淫 | 91网站免费视频 | 日本美女一级片 | 麻豆最新 | 久草中文在线观看 | 成人在线视频免费 | 男人操女人视频网站 | 裸体一区二区 | 精品一区二区三区视频 | 国产免费av一区 | 欧美a√在线 | 超碰97自拍 | 欧美双性人妖o0 | 国产成人中文字幕 | 91影视在线观看 | 欧美成本人视频 | 日韩精品――中文字幕 | 色婷婷色婷婷 | 琪琪五月天 | 日韩在线看片 | 美国三级a三级18 | 日韩簧片 | 日韩一区欧美 | 午夜国产一区二区 | 黄色片网站在线播放 | av女优一区 | 婷婷五月综合久久中文字幕 | 日本高清不卡码 | 一区二区三区天堂 | 欧美日韩一卡 | 一区二区三区视频免费视 | 成人欧美一区二区三区小说 | 日本黄视频在线观看 | 美女脱裤子让男人捅 | 免费成人深夜夜行p站 | 日韩亚洲欧美中文字幕 | 亚洲精品久久久狠狠狠爱 | 久久精品人妻一区二区 | 国产aaa大片| 美女露出粉嫩尿囗让男人桶 | 日韩精品视频在线看 | 日本少妇与黑人 | 天天插天天狠 | 97精品国产97久久久久久粉红 | 久久国 | 国产免费无码一区二区视频 | 黑人巨茎大战欧美白妇 | 自拍偷拍专区 |