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相关推荐

  1. Python Twisted 介绍

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

  2. python twisted教程_twisted基础教程.pdf

    twisted基础教程 Twisted 网络编程必备(一) 0.1 为什么使用Twisted? 如果你并不准备使用Twisted,你可能有很多异议.为什么使用Twisted 而不是其他网络函数 库或框 ...

  3. Python Twisted、Reactor

    catalogue 1. Twisted理论基础 2. 异步编程模式与Reactor 3. Twisted网络编程 4. reactor进程管理编程 5. Twisted并发连接 1. Twisted ...

  4. install python+twisted+mysqldb+django on mac

    一. install python 1) check install or not 在mac终端输入命令:which python 即可查看python的路径 2)未安装时,手动下载安装包 地址:ht ...

  5. python twisted 笔记

    2019独角兽企业重金招聘Python工程师标准>>> 1.Twisted框架构建简单的C/S 要写一个基于twisted框架的服务器,你要实现事件处理器,它处理诸如一个新的客户端连 ...

  6. python twisted教程_Python Twisted系列教程16:Twisted 进程守护

    Fast Poetry 3.0 你可能注意到与其他例子不同, 我们命名了一个不同的目录. 这是因为 twistd 需要插件文件位于 twisted/plugins 目录中, 同时在你的Python搜索 ...

  7. python twisted教程_python-twisted模块代码实例

    Twisted 模块提供了很方便的多任务通信.通过创建协议类来实现. # 客户端 #!/usr/bin/python #coding=utf-8 from twisted.internet impor ...

  8. Python Twisted系列教程16:Twisted 进程守护

    作者:dave@http://krondo.com/twisted-daemonologie/  译者: Cheng Luo 你可以从"第一部分 Twist理论基础"开始阅读:也可 ...

  9. matlab用socket线程发送数据,使用Python Twisted和Autobahn从Matlab通过WebSocket发送JSON数据...

    我正在尝试创建一个从Matlab到WebSocket流JSON帧的连接.我用下面的代码测试了我的python安装和twisted.在 工作实例 Matlab代码 示例驱动程序代码,它使用JSONlab ...

最新文章

  1. 一建机电实务教材电子版_必背!一建《机电实务》高频考点,每日一背
  2. IE与IE内核浏览器的那点事
  3. 安庆机器人编程选_安庆市首届中小学机器人创客竞赛举行 460名选手比智慧拼创新 科技感满满!...
  4. BZOJ 1283 费用流
  5. TSQL--HASH JOIN
  6. 使用ANT编译项目报错 com.sun.image.codec.jpeg does not exist 解决方法
  7. POJ 2886 能被3除尽的数之和
  8. java的import和python的import对比_Java中的Import和Pacakge作用生动详解(感觉python中的import作用差不多)...
  9. SOLIDWORKS工程图教程:SOLIDWORKS2019工程图新增功能
  10. 网易邮箱显示服务器返回错误,企业退信的常见问题?
  11. 阿里巴巴 29 个屌炸天的开源项目!
  12. SD卡和SDHC卡操作
  13. 美国计算机编程竞赛,USACO美国计算机竞赛
  14. iframe不能显示内容的问题
  15. linux系统python3环境下安装pymysql模块
  16. C语言中指向函数的指针(我见过的讲的最清晰的文章)
  17. 一个悲观主义者的积极思考——职业篇[待续2021/06/27]
  18. C语言-解释复杂声明
  19. 敏捷转型行动笔记:内部敏捷教练实践
  20. 11.集合之List

热门文章

  1. c51单片机c语言显示矩形波,51单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序...
  2. 研报精选230518
  3. 步进电机 高速光耦_双向高速高速度光耦模块作用,光耦控制继电器原理图
  4. ESET NOD32官方活动送一年激活码(9月4号更新)
  5. 如何比较视频编码器的性能
  6. 【千律】C++基础:ShellExecuteEx 函数的相关使用案例
  7. 玫琳凯公司任命Wendy Wang为亚太区总裁
  8. php sigpipe,遭遇SIGPIPE[转]
  9. MySQL 获取当前时间戳
  10. java byte 0xFF