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 ...
随机推荐
- iOS学习——自动定位
最近在项目中需要做自动定位功能,就是你在参加会议通过扫描二维码签到的时候自动定位并将你的定位信息在签到中上传,这样可以避免我们进行假签到.在这个功能中,主要用到的是系统自带的定位模块,首先我们是需要配 ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- AC自动机模板2(【CJOJ1435】)
题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模 ...
- 【BZOJ1305】跳舞(网络流)
[BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...
- Bzoj2134:单选错位
题面 Bzoj Sol 第\(i\)道题选对的概率就是\(\frac{min(a[i-1], a[i])}{a[i]*a[i-1]}\) # include <bits/stdc++.h> ...
- SQL基础教程读书笔记-3
5 复杂查询 5.1 视图 1.表和视图的区别表:保存的是实际的数据视图:保存的是SELECT语句.从视图读取数据时,视图会在内部执行该SELECT语句并创建出一张临时表. 2.视图的优点① 无需保存 ...
- angular路由详解四(子路由)
子路由是相对路由 路由配置部分: 主要是children const routes: Routes = [ {path:'home', component: HomeComponent, childr ...
- 数组的迭代方法(every、filter、forEach、map、some)
every: 对数组中的,每一项运行给定函数,如果该函数对每一项都返回true,则返回true. var number = [1,2,3,4,5,6]; var result = number.eve ...
- Hadoop的Archive归档命令使用指南
hadoop不适合小文件的存储,小文件本省就占用了很多的metadata,就会造成namenode越来越大.Hadoop Archives的出现视为了缓解大量小文件消耗namenode内存的问题. 采 ...
- WordPress源代码压缩优化及常见问题的解决
先来看看效果: 意思就是让你的源代码看起来都挤在一起,这样如果别人想看你的源代码的话就不容易看懂了,(当然如果别人实在想看的话也可以通过某些软件的整理代码的功能来实现,比如IDEA的Ctrl+alt+ ...