Python Twisted
Python Twisted 框架中 socket通信
转载:http://blog.csdn.net/jackyyen/archive/2009/04/13/4069887.aspx
// 部分一
Twisted使用了更多的基于事件的方式。要写一个基本的服务器,你要实现事件处理器,它处理诸如一个新的客户端连接、新的数据到达和客户端连接中断等情况。在Twisted中,你的事件处理器定义在一个protocol中;你也需要一个factory,当一个新的连接到达时它能够构造这个protocol对象,但是如果你仅仅想创建一个自定义的Protocol类的实例的话,你可以使用来自Twisted的factory,Factory类在模块twisted.internet.protocol中。当你写你的protocol时,使用twisted.internet.protocol模块中的Protocol作为你的父类。当你得到一个连接时,事件处理器 connectionMade被调用;当你丢失了一个连接时,connectionLost被调用。从客户端接受数据使用处理器 dataReceived。但是你不能使用事件处理策略向客户端发送数据;要向客户端发送数据,你可以使用self.transport,它有一个 write方法。它也有一个client属性,其中包含了客户端的地址(主机名和端口)。
下面这个例子是一个Twisted版的服务器。其中实例化了Factory并设置了它的protocol属性以便它知道使用哪个protocol与客户端通信(这就是所谓的你的自定义 protocol)。然后你使用factory开始监听指定的端口,factory通过实例化的protocol对象处理连接。监听使用reactor模块中的listenTCP函数。最后,你通过调用reactor模块中的run函数来开始服务器。
简单服务器代码from twisted.internet import reactor from twisted.internet.protocol import Protocol, Factory# 定义你Protocol类 class SimpleLogger(Protocol):def connectionMade(self):print 'Got connection from', self.transport.clientdef connectionLost(self, reason):print self.transport.client, 'disconnected'def dataReceived(self, data):print data# 实例化Factory factory = Factory()# 设置factory的protocol属性以便它知道使用哪个protocol与客户端通信(这就是所谓的你的自定义 # protocol) factory.protocol = SimpleLogger# 监听指定的端口 reactor.listenTCP(1234, factory)# 开始运行主程序 reactor.run()
为你的处理目的而写一个自定义的protocol是很容易的。模块twisted.protocols.basic中包含了几个有用的已存在的 protocol,其中的LineReceiver执行dataReceived并在接受到了一个完整的行时调用事件处理器lineReceived。如果当你在接受数据时除了使用lineReceived,还要做些别的,那么你可以使用LineReceiver定义的名为rawDataReceived 事件处理器。下面是一使用LineReceiver的服务器例子:
代码from twisted.internet import reactor from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiverclass SimpleLogger(LineReceiver):def connectionMade(self):print 'Got connection from', self.transport.clientdef connectionLost(self, reason):print self.transport.client, 'disconnected'def lineReceived(self, line):print linefactory = Factory() factory.protocol = SimpleLogger reactor.listenTCP(1234, factory) reactor.run()
服务器实例# -*- coding: UTF-8 -*- #Twisted MMORPG from twisted.internet.protocol import Factory from twisted.protocols.basic import LineOnlyReceiver from twisted.internet import reactor import random import string class Game(LineOnlyReceiver): def lineReceived(self, data): self.factory.sendAll("%s" % (data)) def getId(self): return str(self.transport.getPeer()) def connectionMade(self): print "New User Login:", self.getId() self.transport.write("欢迎来到MMO世界!\n") self.factory.addClient(self) def connectionLost(self, reason): self.factory.delClient(self) class GameFactory(Factory): protocol = Game def __init__(self): self.clients = [] self.player = [] self.msg='' self.x = range(100,700) self.y = range(100,500) def getPlayerId(self): return len(self.player) def addClient(self, newclient): self.clients.append(newclient) def delClient(self, client): self.clients.remove(client) def sendAll(self, data): #print data if data.find('<policy-file-request/>')!=-1: proto.transport.write('<cross-domain-policy><allow-access-from domain="127.0.0.1" to-ports="*"/></cross-domain-policy>\0') else: arr = data.split(':') prefix = arr[0] content = arr[1] if prefix.find('player')!=-1: newPlayer = [content,str(random.randrange(200, 600)),str(random.randrange(150,350)),str(random.randrange(1,5))] self.player.append(newPlayer) self.msg = ' 玩家 '+content+' 进入游戏!' #广播所有玩家的位置 temp = [] playerData = ':::' for pos in self.player: temp.append(string.join(pos,'---')) playerData = playerData+string.join(temp,'***') for proto in self.clients: proto.transport.write('[系统]: '+self.msg+'\n') proto.transport.write(playerData) elif prefix.find('pos')!=-1: playerName,x,y = content.split('---') i = 0 for p in self.player: if p[0]==playerName: p[1]=x p[2]=y for proto in self.clients: proto.transport.write(data) else: self.msg = data for proto in self.clients: proto.transport.write(self.msg+'\n') reactor.listenTCP(8006, GameFactory()) reactor.run()
客户端实例(与上例不联系)from twisted.internet.protocol import ClientCreator, Protocol from twisted.protocols.basic import LineReceiver from twisted.internet import reactor import sysclass Sender(Protocol):def sendCommand(self, command):print "invio", commandself.transport.write(command)def dataReceived(self, data):print "DATA", dataPORT = 5005 HOST = 'localhost'def sendCommand(command):def test(d):print "Invio ->", commandd.sendCommand(command)c = ClientCreator(reactor, Sender)c.connectTCP(HOST, PORT).addCallback(test)if __name__ == '__main__':if len(sys.argv) != 2 or sys.argv[1] not in ['stop', 'next_call', 'force']:sys.stderr.write('Usage: %s: {stop|next_call|force}\n' % sys.argv[0])sys.exit(1)sendCommand(sys.argv[1]+'\n')reactor.run()
转载于:https://www.cnblogs.com/thbCode/p/4425762.html
Python Twisted相关推荐
- Python Twisted 介绍
Python Twisted介绍:http://blog.csdn.net/hanhuili/article/details/9389433 原文链接:http://www.aosabook.org/ ...
- python twisted教程_twisted基础教程.pdf
twisted基础教程 Twisted 网络编程必备(一) 0.1 为什么使用Twisted? 如果你并不准备使用Twisted,你可能有很多异议.为什么使用Twisted 而不是其他网络函数 库或框 ...
- Python Twisted、Reactor
catalogue 1. Twisted理论基础 2. 异步编程模式与Reactor 3. Twisted网络编程 4. reactor进程管理编程 5. Twisted并发连接 1. Twisted ...
- install python+twisted+mysqldb+django on mac
一. install python 1) check install or not 在mac终端输入命令:which python 即可查看python的路径 2)未安装时,手动下载安装包 地址:ht ...
- python twisted 笔记
2019独角兽企业重金招聘Python工程师标准>>> 1.Twisted框架构建简单的C/S 要写一个基于twisted框架的服务器,你要实现事件处理器,它处理诸如一个新的客户端连 ...
- python twisted教程_Python Twisted系列教程16:Twisted 进程守护
Fast Poetry 3.0 你可能注意到与其他例子不同, 我们命名了一个不同的目录. 这是因为 twistd 需要插件文件位于 twisted/plugins 目录中, 同时在你的Python搜索 ...
- python twisted教程_python-twisted模块代码实例
Twisted 模块提供了很方便的多任务通信.通过创建协议类来实现. # 客户端 #!/usr/bin/python #coding=utf-8 from twisted.internet impor ...
- Python Twisted系列教程16:Twisted 进程守护
作者:dave@http://krondo.com/twisted-daemonologie/ 译者: Cheng Luo 你可以从"第一部分 Twist理论基础"开始阅读:也可 ...
- matlab用socket线程发送数据,使用Python Twisted和Autobahn从Matlab通过WebSocket发送JSON数据...
我正在尝试创建一个从Matlab到WebSocket流JSON帧的连接.我用下面的代码测试了我的python安装和twisted.在 工作实例 Matlab代码 示例驱动程序代码,它使用JSONlab ...
最新文章
- 一建机电实务教材电子版_必背!一建《机电实务》高频考点,每日一背
- IE与IE内核浏览器的那点事
- 安庆机器人编程选_安庆市首届中小学机器人创客竞赛举行 460名选手比智慧拼创新 科技感满满!...
- BZOJ 1283 费用流
- TSQL--HASH JOIN
- 使用ANT编译项目报错 com.sun.image.codec.jpeg does not exist 解决方法
- POJ 2886 能被3除尽的数之和
- java的import和python的import对比_Java中的Import和Pacakge作用生动详解(感觉python中的import作用差不多)...
- SOLIDWORKS工程图教程:SOLIDWORKS2019工程图新增功能
- 网易邮箱显示服务器返回错误,企业退信的常见问题?
- 阿里巴巴 29 个屌炸天的开源项目!
- SD卡和SDHC卡操作
- 美国计算机编程竞赛,USACO美国计算机竞赛
- iframe不能显示内容的问题
- linux系统python3环境下安装pymysql模块
- C语言中指向函数的指针(我见过的讲的最清晰的文章)
- 一个悲观主义者的积极思考——职业篇[待续2021/06/27]
- C语言-解释复杂声明
- 敏捷转型行动笔记:内部敏捷教练实践
- 11.集合之List
热门文章
- c51单片机c语言显示矩形波,51单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序...
- 研报精选230518
- 步进电机 高速光耦_双向高速高速度光耦模块作用,光耦控制继电器原理图
- ESET NOD32官方活动送一年激活码(9月4号更新)
- 如何比较视频编码器的性能
- 【千律】C++基础:ShellExecuteEx 函数的相关使用案例
- 玫琳凯公司任命Wendy Wang为亚太区总裁
- php sigpipe,遭遇SIGPIPE[转]
- MySQL 获取当前时间戳
- java byte 0xFF