日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/3/15 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原地址:http://www.9miao.com/question-15-53940.html

?

好,經(jīng)過上一篇不權(quán)威的講解,大家已經(jīng)能輕易地讓客戶端和服務(wù)端連接起來了。

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

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

聲明:
本教程基于FireFly1.2.2版本、Python2.7版本。
本教程面向Python和FireFly初學(xué)者中的初學(xué)者(比如我)
本教程由笨木頭花心貢獻(xiàn),花心?不,是用心~!
轉(zhuǎn)載請注明原文地址:http://www.benmutou.com/blog/archives/727

1. Pythone struct模塊
Struct模塊主要是用來對數(shù)據(jù)進(jìn)行打包和解包的,和LiberateFactory不一樣,LiberateFactory已經(jīng)說了,是協(xié)議工廠,當(dāng)然就主要是對協(xié)議進(jìn)行封裝和解析。而struct是對更底層的數(shù)據(jù)操作,是把數(shù)據(jù)打包成二進(jìn)制的形式,然后在網(wǎng)絡(luò)中傳輸。解包也一樣,把二進(jìn)制形式的數(shù)據(jù)解包成Pythone需要或者說比較好識別的格式。
反正,總之,struct模塊是對數(shù)據(jù)進(jìn)行打包和解包的,解釋完畢~

2. 可以發(fā)送請求的客戶端(client.py)
我們要修改客戶端,以便它可以發(fā)送數(shù)據(jù)給服務(wù)端。

  • #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) # 協(xié)議頭0

  • ? ? HEAD_1 = chr(0) # 協(xié)議頭1

  • ? ? HEAD_2 = chr(0) # 協(xié)議頭2

  • ? ? HEAD_3 = chr(0) # 協(xié)議頭3

  • ? ? ProtoVersion = chr(0) # 協(xié)議頭版本號

  • ? ? ServerVersion = 0 # 服務(wù)器版本號

  • ? ? sendstr = sendstr

  • ?

  • ? ? data = struct.pack('!sssss3I', HEAD_0, HEAD_1, HEAD_2, HEAD_3,\

  • ? ? ProtoVersion, ServerVersion, len(sendstr) + 4, commandId)

  • ?

  • ? ? senddata = data + sendstr

  • ? ? return senddata

  • ?

  • if __name__ == '__main__':

  • ? ? HOST = "localhost" # 服務(wù)端地址

  • ? ? PORT = 1000 # 服務(wù)端端口

  • ? ? ADDR = (HOST, PORT)

  • ?

  • ? ? client = socket(AF_INET, SOCK_STREAM) # 創(chuàng)建socket,TCP

  • ? ? client.connect(ADDR) # 連接服務(wù)器

  • ? ? client.sendall(sendData('hello server', 1))# 發(fā)送數(shù)據(jù)給服務(wù)器

  • ? ? while True:

  • ? ?? ???pass

  • ?

  • 復(fù)制代碼

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

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

    經(jīng)過我“深入”FireFly源碼之后,發(fā)現(xiàn)了確實(shí)有這么一個(gè)用途,當(dāng)服務(wù)端的協(xié)議工廠接收到數(shù)據(jù)時(shí),會(huì)先判斷這些協(xié)議頭和版本號是否正確,不正確的話,是不會(huì)往下繼續(xù)執(zhí)行的。
    由于這是入門教程,就不一層層地貼這些代碼了,也不繼續(xù)深入了,因?yàn)樗皇潜疚牡闹攸c(diǎn)。

    重點(diǎn)是struct的pack函數(shù),大家可以看看這篇文章:
    http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html
    只看第1、2點(diǎn)就暫時(shí)夠用了。

    于是,上面代碼里的pack函數(shù)就是把4個(gè)協(xié)議頭、協(xié)議頭版本號、服務(wù)器版本號、發(fā)送的數(shù)據(jù)長度、命令碼打包。
    這樣打包后的數(shù)據(jù)作為一個(gè)數(shù)據(jù)的頭部信息,顧名思義,頭部信息就是記錄一次發(fā)送數(shù)據(jù)的主要信息,比如長度、版本、命令碼。(小若:廢話!上面都說了把這些東西打包了)

    然后我們看看這句代碼:senddata = data + sendstr。
    為什么發(fā)送的數(shù)據(jù)字符串不需要參與打包呢?我也很白癡地試了一下把數(shù)據(jù)字符串也一起參與打包,結(jié)果是一樣的。
    于是,據(jù)我所知,字符串可以直接傳輸(字節(jié)流),不需要再進(jìn)行什么打包了。

    2.2 發(fā)送數(shù)據(jù)
    客戶端要發(fā)送數(shù)據(jù)給服務(wù)端很簡單:client.sendall(sendData(‘hello server’, 1))
    這句代碼的意思是,發(fā)送字符串‘hello server’給服務(wù)端,命令碼是1。
    結(jié)合之前說的,命令碼1會(huì)參與到數(shù)據(jù)頭部信息一起打包,而字符串’hello server’是直接和打包后的數(shù)據(jù)連接的,不需要參與打包。

    2.3 為什么數(shù)據(jù)長度要+4?
    不知道大家會(huì)不會(huì)有個(gè)疑問,就是打包的時(shí)候這個(gè)參數(shù):len(sendstr) + 4
    為什么長度要+4,木頭我是弄不明白了,我查看了源碼,在解析頭部信息的時(shí)候,獲取數(shù)據(jù)長度值時(shí),又減去了4。這看起來有點(diǎn)多此一舉,據(jù)我目前的研究,還沒法知道原因,希望高手支招。

    轉(zhuǎn)載于:https://www.cnblogs.com/123ing/p/3905096.html

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。