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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Twisted 介绍 及TCP广播系统实例

發(fā)布時間:2025/3/21 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Twisted 介绍 及TCP广播系统实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

twisted 提供更多傳輸層 udp,tcp,tls及應(yīng)用層HTTP,FTP等協(xié)議的支持,在開發(fā)方法上更提供了豐富的特性來支持異步編程

安裝twisted

建議使用anaconda 安裝,conda install twisted,

Windows 安裝需要先安裝兩個支持庫,zope inteeface和pywin32 然后pip?install twisted,

Linux系統(tǒng) 直接命令行 apt-get install python-twisted 或者yum install?python-twisted?

實戰(zhàn)演練 - 開發(fā)TCP廣播系統(tǒng)

系統(tǒng)描述:廣播系統(tǒng)接收任意客戶端的鏈接請求,并將任意客戶端發(fā)送給服務(wù)器的消息轉(zhuǎn)發(fā)給所有其他客戶端,本系統(tǒng)是一個基本的實時通信模型

1、廣播服務(wù)器

?twisted基于傳輸層TCP編程時,直接針對Twisted的Protocol,Factory等類進(jìn)行編程,而無需操作socket里面的bind,send,receive等基本用語,并且定義他們的子類并重寫connectionMode,dataReceived進(jìn)行事件化的TCP變成風(fēng)格

  • connectionMode() 當(dāng)鏈接建立時由twisted框架調(diào)用,本函數(shù)主要作用是在系統(tǒng)中注冊該鏈接,方便調(diào)用
  • dataReceived() 當(dāng)收到客戶端數(shù)據(jù)時由twisted框架調(diào)用
  • connectionLost()當(dāng)鏈接斷開時由框架調(diào)用,實際應(yīng)用中用來清理鏈接占用的資源?

本廣播系統(tǒng)的Protocol代碼為:

from twisted.internet.protocol import Protocolclients = [] # 保存所有客戶端連接class Spreader (Protocol): # 繼承Protocol,實現(xiàn)需要重載的方法def __init__(self, factory):self.factory = factorydef connectionMade(self): # 對連接的客戶端計數(shù),并保存到clients列表中self.factory.numProtocols = self.factory.numProtocols + 1self.transport.write (("歡迎來到Spread site,你是第%d 個客戶端用戶!\n" % (self.factory.numProtocols)).encode ('utf8'))print ("新連接: %d" % self.factory.numProtocols)clients.append (self)def connectionLost(self, reason): # 執(zhí)行反向操作self.factory.numProtocols = self.factory.numProtocols - 1clients.remove (self)print ("關(guān)閉連接:%d" % self.factory.numProtocols)def dataReceived(self, data): # 循環(huán)當(dāng)前clients列表中的所有客戶端,將受到的數(shù)據(jù),分發(fā)給自己之外的所有客戶端if data == 'close': # 如果受到客戶端發(fā)來的數(shù)據(jù)‘close’ ,則主動關(guān)閉與該客戶端的鏈接 self.transport.lostConnection ()for client in clients:if client != self:client.transport.write (data)

開發(fā)Factory子類

Factory類起到了 對Protocol 類的管理作用,當(dāng)有新的客戶端鏈接時,框架調(diào)用Factory.buildProtocol(),可以創(chuàng)建Protoco子類的實例,代碼如下

from twisted.internet.protocol import Factoryfrom twisted.internet.endpoints import TCP4ServerEndpoint from twisted.internet import reactorclass SpreaderFactory(Factory):def __init__(self):self.numProtocols = 0def buildProtocol(self, addr):return Spreader(self)# 8007是本服務(wù)器的監(jiān)聽端口 endpoint = TCP4ServerEndpoint(reactor,8007) endpoint.listen(SpreaderFactory())reactor.run() # 掛起運行

2、廣播客戶端

實現(xiàn)與服務(wù)器程序相匹配的TCP客戶端程序

from twisted.internet.protocol import Protocol, ClientFactoryfrom twisted.internet import reactor import threading import fileinput import time import sys import datetimeclass Echo (Protocol): # Protocol子類,此處進(jìn)行通信邏輯開發(fā)def __init__(self):self.connected = False # 在函數(shù)routine中使用該狀態(tài)決定是否向服務(wù)器發(fā)送消息def connectionMade(self):self.connected = Truedef connectionLost(self, reason):self.connected = Falsedef dataReceived(self, data):print (data.decode ('utf8'))class EchoClientFactory (ClientFactory): # Factory子類,管理鏈接關(guān)系def __init__(self):self.protocol = Nonedef startedConnecting(self, connector):print ("開始鏈接")def buildProtocol(self, addr):print ('已連接')self.protocol = Echo ()return self.protocoldef clientConnectionLost(self, connector, reason):print ("鏈接丟失,原因是:", reason)def clientConnectionFailed(self, connector, reason):print ('鏈接失敗,原因是:', reason)bStop = Falsedef routine(factory): # 每隔5秒向服務(wù)器發(fā)送消息while not bStop:if factory.protocol and factory.protocol.connected:factory.protocol.transport.write(('hello,i am xx %s' % (datetime.datetime.now())).encode('utf8'))time.sleep(5)host = '127.0.0.1' port = 8007 factory = EchoClientFactory() reactor.connectTCP(host,port,factory) threading.Thread(target=routine,args=(factory,)).start() # 啟動縣城運行routine()函數(shù) reactor.run() # 掛起運行 bStop = True # 通知routine線程退出

?結(jié)果:

server:

?

客戶端:

?

轉(zhuǎn)載于:https://www.cnblogs.com/Erick-L/p/7084810.html

總結(jié)

以上是生活随笔為你收集整理的Twisted 介绍 及TCP广播系统实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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