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 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广播系统实例相关推荐
- Python Twisted 介绍
Python Twisted介绍:http://blog.csdn.net/hanhuili/article/details/9389433 原文链接:http://www.aosabook.org/ ...
- Python Twisted介绍
原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted是用Python实现的基于事件驱动的网络引擎框架.Twi ...
- Scrapy-Splash的介绍、安装以及实例
scrapy-splash的介绍 在前面的博客中,我们已经见识到了Scrapy的强大之处.但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取JavaScrip ...
- 欧姆龙OMRON PLC之HostLink通讯协议(五)- CP1H以太网FINS/TCP通讯实例
//写在前面: 自2010年起,本人陆续在新浪博客上面发了几篇OMRON PLC的应用笔记,曾经很疑惑阅读量异常增加,后来发现原来是这里有人转载.现将原文照发在这里,希望能帮到做工控的同行朋友们. C ...
- 【转】欧姆龙OMRON PLC之 CP1H 以太网FINS/TCP通讯实例
原文:http://blog.sina.com.cn/s/blog_539cee190102wr4t.html CP1H上面的选件板插槽可以插入1-2块CP1W-CIF41模块,系统即具有了以太网功能 ...
- html自定义datajs,科技常识:HTML5的自定义属性data-*详细介绍和JS操作实例
今天小编跟大家讲解下有关HTML5的自定义属性data-*详细介绍和JS操作实例 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5的自定义属性data-*详细介绍和JS操作实例 的 ...
- python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...
本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import ( ...
- python_day6_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承、多继承和继承实例/多态
python_面向对象的介绍/构造函数/类变量和实例变量/析构函数/私有属性和私有方法/继承.多继承和继承实例/多态 在这里得感谢,老师Alex金角大王(路飞学城IT) Python(给兄弟们挂个
- linux中的chmod命令详细介绍、使用及实例
linux中的chmod命令详细介绍.使用及实例 chmod命令 chmod用于改变 linux 系统文件或目录的访问权限,可以用它控制文件或目录的访问权限.该命令有两种用法:一种是包含字母的文字设定 ...
最新文章
- 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)
- antimalware service executable占用内存过高_Win10系统svchost.exe进程占用内存和网速过高的解决方法...
- c++operators(运算符)
- Netty工作笔记0064---WebSocket长连接开发3
- tp中 M和 D的区别
- Jboss 安装配置
- 2021年9月再次更新-日立电梯,艾默生变频器维修图纸,原理图
- Java jdk下载安装与配置及其不同版本jdk切换
- 互联网入口,一个正在消失的“黑洞”
- 好用的日程管理计划软件——滴答清单
- Sensor 数据整理
- C语言根据国家英文首字母进行排序
- 获取QQ好友共同好友列表信息
- 关于linux系统遍历一个目录下所有文件的代码原理以及代码
- linux下jdk的安装与配置jdk-6u45-linux-i586.bin
- keras_contrib使用问题
- 数字标牌软件测试,数字标牌系统
- 150条经典装逼语录
- 外省籍居民身份证换领、补领【浙江政务服务网——在线办理】
- 12对胸椎对应体表标志_第一节 胸部的体表标志