Twisted 介绍 及TCP广播系统实例
twisted 提供更多传输层 udp,tcp,tls及应用层HTTP,FTP等协议的支持,在开发方法上更提供了丰富的特性来支持异步编程
安装twisted
建议使用anaconda 安装,conda install twisted,
Windows 安装需要先安装两个支持库,zope inteeface和pywin32 然后pip install twisted,
Linux系统 直接命令行 apt-get install python-twisted 或者yum install python-twisted
实战演练 - 开发TCP广播系统
系统描述:广播系统接收任意客户端的链接请求,并将任意客户端发送给服务器的消息转发给所有其他客户端,本系统是一个基本的实时通信模型
1、广播服务器
twisted基于传输层TCP编程时,直接针对Twisted的Protocol,Factory等类进行编程,而无需操作socket里面的bind,send,receive等基本用语,并且定义他们的子类并重写connectionMode,dataReceived进行事件化的TCP变成风格
- connectionMode() 当链接建立时由twisted框架调用,本函数主要作用是在系统中注册该链接,方便调用
- dataReceived() 当收到客户端数据时由twisted框架调用
- connectionLost()当链接断开时由框架调用,实际应用中用来清理链接占用的资源
本广播系统的Protocol代码为:
from twisted.internet.protocol import Protocol clients = [] # 保存所有客户端连接 class Spreader (Protocol): # 继承Protocol,实现需要重载的方法
def __init__(self, factory):
self.factory = factory def connectionMade(self): # 对连接的客户端计数,并保存到clients列表中
self.factory.numProtocols = self.factory.numProtocols + 1
self.transport.write (("欢迎来到Spread site,你是第%d 个客户端用户!\n" % (self.factory.numProtocols)).encode ('utf8'))
print ("新连接: %d" % self.factory.numProtocols)
clients.append (self) def connectionLost(self, reason): # 执行反向操作
self.factory.numProtocols = self.factory.numProtocols - 1
clients.remove (self)
print ("关闭连接:%d" % self.factory.numProtocols) def dataReceived(self, data): # 循环当前clients列表中的所有客户端,将受到的数据,分发给自己之外的所有客户端
if data == 'close': # 如果受到客户端发来的数据‘close’ ,则主动关闭与该客户端的链接
self.transport.lostConnection ()
for client in clients:
if client != self:
client.transport.write (data)
开发Factory子类
Factory类起到了 对Protocol 类的管理作用,当有新的客户端链接时,框架调用Factory.buildProtocol(),可以创建Protoco子类的实例,代码如下
from twisted.internet.protocol import Factory from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor class SpreaderFactory(Factory):
def __init__(self):
self.numProtocols = 0 def buildProtocol(self, addr): return Spreader(self) # 8007是本服务器的监听端口
endpoint = TCP4ServerEndpoint(reactor,8007)
endpoint.listen(SpreaderFactory()) reactor.run() # 挂起运行
2、广播客户端
实现与服务器程序相匹配的TCP客户端程序
from twisted.internet.protocol import Protocol, ClientFactory from twisted.internet import reactor
import threading
import fileinput
import time
import sys
import datetime class Echo (Protocol): # Protocol子类,此处进行通信逻辑开发
def __init__(self):
self.connected = False # 在函数routine中使用该状态决定是否向服务器发送消息 def connectionMade(self):
self.connected = True def connectionLost(self, reason):
self.connected = False def dataReceived(self, data):
print (data.decode ('utf8')) class EchoClientFactory (ClientFactory): # Factory子类,管理链接关系
def __init__(self):
self.protocol = None def startedConnecting(self, connector):
print ("开始链接") def buildProtocol(self, addr):
print ('已连接')
self.protocol = Echo ()
return self.protocol def clientConnectionLost(self, connector, reason):
print ("链接丢失,原因是:", reason) def clientConnectionFailed(self, connector, reason):
print ('链接失败,原因是:', reason) bStop = False def routine(factory): # 每隔5秒向服务器发送消息
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()函数
reactor.run() # 挂起运行
bStop = True # 通知routine线程退出
结果:
server:

客户端:

Twisted 介绍 及TCP广播系统实例的更多相关文章
- 【转】Python Twisted介绍
Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...
- Python Twisted介绍
原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted是用Python实现的基于事件驱动的网络引擎框架.Twi ...
- Scrapy-Splash的介绍、安装以及实例
scrapy-splash的介绍 在前面的博客中,我们已经见识到了Scrapy的强大之处.但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取JavaScrip ...
- sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
- .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
- freemarker语法介绍及其入门教程实例
# freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>#### 1.文本,直接输 ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- java tcp socket实例
java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...
- Rxjava2 介绍与详解实例
目录 前言 RX介绍 Rx模式 Rx使用依赖: Rxjava的入门基础 1. Observable 2. Flowable 3. Single 4. Completable 5. Maybe 6. S ...
随机推荐
- python根据索引删除内容并写入文本
在python中,有个好用的模块linecache,该模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行.linecache.getline(filename,li ...
- tomcat启动很慢很慢很慢
今天下载tomcat8.5,启动的时候发现非常慢,大概三分钟左右才能启动,网上搜到一个解决方案,在此记录下来 原因: Tomcat 7/8都使用org.apache.catalina.util.Ses ...
- 【BZOJ2342】双倍回文(回文树)
[BZOJ2342]双倍回文(回文树) 题面 BZOJ 题解 构建出回文树之后 在\(fail\)树上进行\(dp\) 如果一个点代表的回文串长度为\(4\)的倍数 并且存在长度为它的一半的回文后缀 ...
- poi导入Excel,数字科学记数法转换
在这里分享一下使用poi 导入Excel时 把数字转换为科学记数法的解决方法: 就是使用DecimalFormat对 i 进行了格式化 结果为:
- highCharts实现简单柱形图
js: function chart(data,title){ $('#container').highcharts({ chart: { type: 'bar' }, title: { text: ...
- c#多线程同步之EventWaitHandle使用
有这么一个场景,我需要借助windows剪贴板把数据插入到word域中. 实现步骤: 1.把剪贴板数据保存到变量. 2.使用剪贴板实现我们的业务. 3.把变量里的数据存回剪贴板. 但是结果却令人诧异, ...
- redis学习系列——redis持久化
1.写操作的流程 2.RDB快照-redis的第一个持久化策略 第一种是以快照的形式持久化到本地磁盘(RDB文件). 持久化策略是: 1.配置(save N M)在N秒内,redis至少发生M次修改, ...
- 用MATLAB结合四种方法搜寻罗马尼亚度假问题
选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...
- 【Unity3D与23种设计模式】享元模式(Flyweight)
GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...
- Python机器学习中文版目录
建议Ctrl+D保存到收藏夹,方便随时查看 人工智能(AI)学习资料库 Python机器学习简介 第一章 让计算机从数据中学习 将数据转化为知识 三类机器学习算法 第二章 训练机器学习分类算法 透过人 ...