Python Twisted 框架中 socket通信
来源:互联网 发布:mix软件怎么用 编辑:程序博客网 时间:2024/06/06 16:39
转载: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.protocolimport Protocol, Factory
# 定义你Protocol类
class SimpleLogger(Protocol):
def connectionMade(self):
print'Got connection from', self.transport.client
def 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 reactorfrom twisted.internet.protocol import Factoryfrom twisted.protocols.basic import LineReceiverclass SimpleLogger(LineReceiver): def connectionMade(self): print 'Got connection from', self.transport.client def connectionLost(self, reason): print self.transport.client, 'disconnected' def lineReceived(self, line): print linefactory = Factory()factory.protocol = SimpleLoggerreactor.listenTCP(1234, factory)reactor.run()
//部分二: 一个server实例
# -*- 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()
// 部分三一个client例子,与前文不相关
from twisted.protocols.basicimport LineReceiver
from twisted.internetimport reactor
import sys
class Sender(Protocol):
def sendCommand(self, command):
print"invio", command
self.transport.write(command)
def dataReceived(self, data):
print"DATA", data
PORT =5005
HOST ='localhost'
def sendCommand(command):
def test(d):
print"Invio ->", command
d.sendCommand(command)
c = ClientCreator(reactor, Sender)
c.connectTCP(HOST, PORT).addCallback(test)
if__name__=='__main__':
if len(sys.argv)!=2or sys.argv[1]notin ['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()
- Python Twisted 框架中 socket通信
- Python Twisted 框架中 socket通信
- Python Twisted框架中socket通讯
- python 框架 twisted
- python Twisted框架
- Python Twisted框架
- Python的Twisted框架中reactor事件理解
- Twisted 网络开发python框架
- Python的Twisted框架入门
- python高级应用-twisted框架
- flex与twisted通过socket通信
- Twisted python 开发游戏的服务器框架
- python twisted 框架 client 和server 模型
- Python安装Twisted框架并使用
- Python网络框架Twisted的使用
- python实现网络编程 之Twisted框架
- 详解Python的Twisted框架中reactor事件管理器的用法
- 详解Python的Twisted框架中reactor事件管理器的用法
- delegate和notification的区别
- Hive学习之Hive基本概念及实践
- Source Insight 使用方法入门
- ssh整合中的问题
- JAVA的wait和notify和notifyall
- Python Twisted 框架中 socket通信
- C#调用OFBiz的WebService
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
- Web应用程序通过Tomcat中自带的JNDI设置数据库连接池
- Twisted网络编程必备(1)注:测试版本Twisted-10.1.0.winxp32-py2.6,对于原代码略有修改
- tabhost与百度地图定位冲突
- LeetCode - Sum Root to Leaf Numbers
- Twisted网络编程必备(2)
- Twisted网络编程必备(3)