四棍潘、編程向?qū)?4.10集成其他框架)

編程向?qū)?.10集成其他框架

在Kivy內(nèi)部使用Twisted框架

gthank:Twisted是用Python實(shí)現(xiàn)的基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)引擎框架。Twisted誕生于2000年初,在當(dāng)時(shí)的網(wǎng)絡(luò)游戲開發(fā)者看來(lái)亦歉,無(wú)論他們使用哪種語(yǔ)言恤浪,手中都鮮有可兼顧擴(kuò)展性及跨平臺(tái)的網(wǎng)絡(luò)庫(kù)。Twisted的作者試圖在當(dāng)時(shí)現(xiàn)有的環(huán)境下開發(fā)游戲肴楷,這一步走的非常艱難水由,他們迫切地需要一個(gè)可擴(kuò)展性高、基于事件驅(qū)動(dòng)赛蔫、跨平臺(tái)的網(wǎng)絡(luò)開發(fā)框架砂客,為此他們決定自己實(shí)現(xiàn)一個(gè),并從那些之前的游戲和網(wǎng)絡(luò)應(yīng)用程序的開發(fā)者中學(xué)習(xí)呵恢,汲取他們的經(jīng)驗(yàn)教訓(xùn)鞠值。Twisted支持許多常見的傳輸及應(yīng)用層協(xié)議,包括TCP渗钉、UDP彤恶、SSL/TLS、HTTP晌姚、IMAP粤剧、SSH、IRC以及FTP挥唠。Twisted對(duì)于其支持的所有協(xié)議都帶有客戶端和服務(wù)器實(shí)現(xiàn)抵恋,同時(shí)附帶有基于命令行的工具,使得配置和部署產(chǎn)品級(jí)的Twisted應(yīng)用變得非常方便宝磨。

你可以使用kivy.support.install_twisted_reactor函數(shù)來(lái)安裝一個(gè)運(yùn)行在kivy事件循環(huán)里面的twisted反應(yīng)器弧关。任何傳遞到該函數(shù)的參數(shù)和關(guān)鍵字都會(huì)被傳遞給threadedselect反應(yīng)器交錯(cuò)函數(shù)。通常有一個(gè)參數(shù)傳遞twisted的reactor.startRunning.

警告:不像默認(rèn)的Twisted反應(yīng)器唤锉,安裝的反應(yīng)器不會(huì)處理任何的信號(hào)世囊,除非你設(shè)置了installSignalHandlers關(guān)鍵字參數(shù)為1.這將使kivy來(lái)和平時(shí)一樣來(lái)處理信號(hào),除非你明確地想twisted反應(yīng)器來(lái)處理信號(hào)窿祥。

kivy的樣例中含一個(gè)關(guān)于twisted服務(wù)端和客戶端的小例子株憾。服務(wù)端程序有一個(gè)簡(jiǎn)單的twisted服務(wù)運(yùn)行并在日志上記錄所有的信息∩柜茫客戶端程序能發(fā)送消息到服務(wù)端嗤瞎,并打印它發(fā)送及響應(yīng)它的信息。例子基于twisted文檔的的簡(jiǎn)單的Echo 例子听系,你可以在下面的鏈接找到它們:

為了測(cè)試這個(gè)例子贝奇,首先運(yùn)行echo_server_app.py,接著運(yùn)行echo_client_app.py靠胜。服務(wù)端將會(huì)使用簡(jiǎn)單的echo消息來(lái)回應(yīng)任何來(lái)自客戶端發(fā)送的消息掉瞳。

服務(wù)端:

#在導(dǎo)入和使用反應(yīng)器之前毕源,install_twisted_rector必須首先被調(diào)用
from kivy.support import install_twisted_reactor
install_twisted_reactor()


from twisted.internet import reactor
from twisted.internet import protocol


class EchoProtocol(protocol.Protocol):
    def dataReceived(self, data):
        response = self.factory.app.handle_message(data)
        if response:
            self.transport.write(response)


class EchoFactory(protocol.Factory):
    protocol = EchoProtocol

    def __init__(self, app):
        self.app = app


from kivy.app import App
from kivy.uix.label import Label


class TwistedServerApp(App):
    def build(self):
        self.label = Label(text="server started\n")
        reactor.listenTCP(8000, EchoFactory(self))
        return self.label

    def handle_message(self, msg):
        self.label.text = "received:  %s\n" % msg

        if msg == "ping":
            msg = "pong"
        if msg == "plop":
            msg = "kivy rocks"
        self.label.text += "responded: %s\n" % msg
        return msg


if __name__ == '__main__':
    TwistedServerApp().run()

客戶端:

#在導(dǎo)入和使用反應(yīng)器之前,install_twisted_rector必須首先被調(diào)用
from kivy.support import install_twisted_reactor
install_twisted_reactor()

#一個(gè)簡(jiǎn)單的客戶端陕习,它能發(fā)送消息到echo服務(wù)端
from twisted.internet import reactor, protocol


class EchoClient(protocol.Protocol):
    def connectionMade(self):
        self.factory.app.on_connection(self.transport)

    def dataReceived(self, data):
        self.factory.app.print_message(data)


class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient

    def __init__(self, app):
        self.app = app

    def clientConnectionLost(self, conn, reason):
        self.app.print_message("connection lost")

    def clientConnectionFailed(self, conn, reason):
        self.app.print_message("connection failed")


from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout

#一個(gè)簡(jiǎn)單的kivy應(yīng)用程序创千,帶有一個(gè)文本框來(lái)輸入消息柿冲,
#并有一個(gè)文本標(biāo)簽來(lái)顯示所有的從服務(wù)端返回的消息
class TwistedClientApp(App):
    connection = None

    def build(self):
        root = self.setup_gui()
        self.connect_to_server()
        return root

    def setup_gui(self):
        self.textbox = TextInput(size_hint_y=.1, multiline=False)
        self.textbox.bind(on_text_validate=self.send_message)
        self.label = Label(text='connecting...\n')
        self.layout = BoxLayout(orientation='vertical')
        self.layout.add_widget(self.label)
        self.layout.add_widget(self.textbox)
        return self.layout

    def connect_to_server(self):
        reactor.connectTCP('localhost', 8000, EchoFactory(self))

    def on_connection(self, connection):
        self.print_message("connected succesfully!")
        self.connection = connection

    def send_message(self, *args):
        msg = self.textbox.text
        if msg and self.connection:
            self.connection.write(str(self.textbox.text))
            self.textbox.text = ""

    def print_message(self, msg):
        self.label.text += msg + "\n"

if __name__ == '__main__':
    TwistedClientApp().run()

下節(jié)預(yù)告:編程向?qū)?.11最佳實(shí)踐&4.12高級(jí)圖形技術(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲤孵,一起剝皮案震驚了整個(gè)濱河市蜘腌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拌牲,老刑警劉巖俱饿,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塌忽,居然都是意外死亡拍埠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門土居,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枣购,“玉大人,你說(shuō)我怎么就攤上這事擦耀∶奕Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵眷蜓,是天一觀的道長(zhǎng)分瘾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吁系,這世上最難降的妖魔是什么德召? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮汽纤,結(jié)果婚禮上上岗,老公的妹妹穿的比我還像新娘。我一直安慰自己蕴坪,他們只是感情好肴掷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著背传,像睡著了一般捆等。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上续室,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音谒养,去河邊找鬼挺狰。 笑死明郭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丰泊。 我是一名探鬼主播薯定,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞳购!你這毒婦竟也來(lái)了话侄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤学赛,失蹤者是張志新(化名)和其女友劉穎年堆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盏浇,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变丧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痒蓬。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滴劲,靈堂內(nèi)的尸體忽然破棺而出攻晒,到底是詐尸還是另有隱情,我是刑警寧澤班挖,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布鲁捏,位于F島的核電站,受9級(jí)特大地震影響聪姿,放射性物質(zhì)發(fā)生泄漏碴萧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一末购、第九天 我趴在偏房一處隱蔽的房頂上張望破喻。 院中可真熱鬧,春花似錦盟榴、人聲如沸曹质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羽德。三九已至,卻和暖如春迅办,著一層夾襖步出監(jiān)牢的瞬間宅静,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工站欺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姨夹,地道東北人纤垂。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像磷账,于是被迫代替她去往敵國(guó)和親峭沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容