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 Protocolclients = [] # 保存所有客户端连接class Spreader (Protocol):  # 继承Protocol,实现需要重载的方法def __init__(self, factory):self.factory = factorydef connectionMade(self): # 对连接的客户端计数,并保存到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): # 执行反向操作self.factory.numProtocols = self.factory.numProtocols - 1clients.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 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是本服务器的监听端口
endpoint = TCP4ServerEndpoint(reactor,8007)
endpoint.listen(SpreaderFactory())reactor.run() # 挂起运行

2、广播客户端

实现与服务器程序相匹配的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子类,此处进行通信逻辑开发def __init__(self):self.connected = False  # 在函数routine中使用该状态决定是否向服务器发送消息def connectionMade(self):self.connected = Truedef connectionLost(self, reason):self.connected = Falsedef dataReceived(self, data):print (data.decode ('utf8'))class EchoClientFactory (ClientFactory):  # Factory子类,管理链接关系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秒向服务器发送消息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:

客户端:

转载于:https://www.cnblogs.com/Erick-L/p/7084810.html

Twisted 介绍 及TCP广播系统实例相关推荐

  1. Python Twisted 介绍

    Python Twisted介绍:http://blog.csdn.net/hanhuili/article/details/9389433 原文链接:http://www.aosabook.org/ ...

  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. 欧姆龙OMRON PLC之HostLink通讯协议(五)- CP1H以太网FINS/TCP通讯实例

    //写在前面: 自2010年起,本人陆续在新浪博客上面发了几篇OMRON PLC的应用笔记,曾经很疑惑阅读量异常增加,后来发现原来是这里有人转载.现将原文照发在这里,希望能帮到做工控的同行朋友们. C ...

  5. 【转】欧姆龙OMRON PLC之 CP1H 以太网FINS/TCP通讯实例

    原文:http://blog.sina.com.cn/s/blog_539cee190102wr4t.html CP1H上面的选件板插槽可以插入1-2块CP1W-CIF41模块,系统即具有了以太网功能 ...

  6. html自定义datajs,科技常识:HTML5的自定义属性data-*详细介绍和JS操作实例

    今天小编跟大家讲解下有关HTML5的自定义属性data-*详细介绍和JS操作实例 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5的自定义属性data-*详细介绍和JS操作实例 的 ...

  7. python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import ( ...

  8. python_day6_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承、多继承和继承实例/多态

    python_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承.多继承和继承实例/多态 在这里得感谢,老师Alex金角大王(路飞学城IT) Python(给兄弟们挂个

  9. linux中的chmod命令详细介绍、使用及实例

    linux中的chmod命令详细介绍.使用及实例 chmod命令 chmod用于改变 linux 系统文件或目录的访问权限,可以用它控制文件或目录的访问权限.该命令有两种用法:一种是包含字母的文字设定 ...

最新文章

  1. 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
  2. antimalware service executable占用内存过高_Win10系统svchost.exe进程占用内存和网速过高的解决方法...
  3. c++operators(运算符)
  4. Netty工作笔记0064---WebSocket长连接开发3
  5. tp中  M和 D的区别
  6. Jboss 安装配置
  7. 2021年9月再次更新-日立电梯,艾默生变频器维修图纸,原理图
  8. Java jdk下载安装与配置及其不同版本jdk切换
  9. 互联网入口,一个正在消失的“黑洞”
  10. 好用的日程管理计划软件——滴答清单
  11. Sensor 数据整理
  12. C语言根据国家英文首字母进行排序
  13. 获取QQ好友共同好友列表信息
  14. 关于linux系统遍历一个目录下所有文件的代码原理以及代码
  15. linux下jdk的安装与配置jdk-6u45-linux-i586.bin
  16. keras_contrib使用问题
  17. 数字标牌软件测试,数字标牌系统
  18. 150条经典装逼语录
  19. 外省籍居民身份证换领、补领【浙江政务服务网——在线办理】
  20. 12对胸椎对应体表标志_第一节 胸部的体表标志

热门文章

  1. nodejs express 路由与view创建多级目录
  2. Spring官网阅读(二)(依赖注入及方法注入)
  3. GraphQL是什么“渣渣“?它想干掉RESTful
  4. Netty实现自定义协议
  5. 互联网大厂算法面试题集合,看完我跪了!
  6. 为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作
  7. 阿里员工都是这样排查Java问题的,附工具单
  8. synchronized 关键字原理
  9. Docker实战:Docker安装部署RabbitMQ
  10. 14. 函数返回值为引用?