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. 如何在Java应用中提交Spark任务?

    最近看到有几个Github友关注了Streaming的监控工程--Teddy,所以思来想去还是优化下代码,不能让别人看笑话,是不.于是就想改在一下之前最丑陋的一个地方--任务提交 本博客内容基于Spa ...

  2. css样式--表格

    1.示例源码 <!DOCTYPE html><html><head><meta charset="utf-8"> <title ...

  3. 【BZOJ2431】逆序对数列(动态规划)

    [BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...

  4. Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia

    题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...

  5. [BZOJ1008] [HNOI2008] 越狱 (数学)

    Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...

  6. javascript 特殊的面向对象以及继承详解(入门篇)

    学习Javascript人,大多听说一句话叫js里面一切都是对象.我刚开始接触javascript面向对象编程时候,挺乱的,我当时习惯性的把PHP的面像对象思想套用在js上面,其实js的面向对象与传统 ...

  7. Spring AOP梳理

    一.Srping AOP AOP(Aspect Oriented Programming)解释为面向切面编程,何为切面,用刀把一块面包切成两半,刀切下去形成的面就叫切面,那么面向切面的就是形成切面的这 ...

  8. webstorm提交版本时,忽略特定文件

    项目提交时,部分本地配置文件,不需要提交,这时候需要在整个版本控制中忽略掉文件的提交. 操作如下: File -> Settings -> Version Control -> Ig ...

  9. cookie 使用方法

    //写cookies setCookie: function(name, value) { let days = 1 let exp = new Date() exp.setTime(exp.getT ...

  10. 利用CDLinux里面的水滴破解路由器密码的教程

    工具: 1.CDLinux系统镜像(网上有很多,这里我提供一个我使用的:http://yunpan.cn/cFgIifL8s6zUF 访问密码 a0ef) 2.U盘一个,不需要很大.(可以使用虚拟机安 ...