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广播系统实例的更多相关文章

  1. 【转】Python Twisted介绍

    Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...

  2. Python Twisted介绍

    原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted是用Python实现的基于事件驱动的网络引擎框架.Twi ...

  3. Scrapy-Splash的介绍、安装以及实例

    scrapy-splash的介绍   在前面的博客中,我们已经见识到了Scrapy的强大之处.但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取JavaScrip ...

  4. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  5. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  6. freemarker语法介绍及其入门教程实例

    # freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>####  1.文本,直接输 ...

  7. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  8. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  9. Rxjava2 介绍与详解实例

    目录 前言 RX介绍 Rx模式 Rx使用依赖: Rxjava的入门基础 1. Observable 2. Flowable 3. Single 4. Completable 5. Maybe 6. S ...

随机推荐

  1. ThreadLocal原理

    ThreadLocal类可以看作是当前线程的一个局部变量,只有当前线程可以访问,因此是线程安全的. ThreadLocal内部维护了一个ThreadLocalMap类,ThreadLocalMap是一 ...

  2. 第十篇:K均值聚类(KMeans)

    前言 本文讲解如何使用R语言进行 KMeans 均值聚类分析,并以一个关于人口出生率死亡率的实例演示具体分析步骤. 聚类分析总体流程 1. 载入并了解数据集:2. 调用聚类函数进行聚类:3. 查看聚类 ...

  3. [BZOJ1005] [HNOI2008] 明明的烦恼 (prufer编码)

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...

  4. 初探Electron

    Electron是什么? 官网是这么描述的:Build cross platform desktop apps with JavaScript, HTML, and CSS 翻译一下:使用JavaSc ...

  5. java抽象类注意问题

    当知道一个类的子类将不同的实现某个方法时,把该类声明为抽象类很有用,可以共用相同的父类方法,不必再定义. 抽象类和抽象方法的关系:含有抽象方法的类一定是抽象类,抽象类里不一定含有抽象方法. 抽象类存在 ...

  6. kafka集群参数解析server.properties

    #server.properties配置文件 broker.id=1 port=9092 host.name=url1 zookeeper.connect=url1:2181,url2:2181,ur ...

  7. 记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

    开发目标: (1) 对于Android手机,直接通过微信小程序调用手机的NFC功能,对15693协议的芯片进行读写操作: (2)对于苹果手机(及没有NFC模块的手机),通过微信小程序的蓝牙功能连接到蓝 ...

  8. Oracle GoldenGate实现数据库同步

    前言:最近刚好在弄数据库同步,网上查了些资料再加上自己整理了一些,做个分享! 一.GoldenGate的安装 1.安装包准备 数据库版本:Oracle Database 11g Release 2(1 ...

  9. Error400

    关于Error400,研究了几天终于弄明白了.不是FQ的问题,也不是DNS污染的问题.之前网上很多帖子说Error400可以通过删除 cookies来解决.但是其实这个并不管用.也就是说.原因并不是由 ...

  10. centos7上修改主机名

    centos7上修改主机名 2017-10-09   13:45:17 个人原创,转载请注明,否则追究法律责任 1,临时修改: 和centos5,centos6 一样,重启失效 2,永久修改: 命令: ...