python socket通信框架_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函数来开始服务器。

代码

fromtwisted.internetimportreactorfromtwisted.internet.protocolimportProtocol, Factory#定义你Protocol类classSimpleLogger(Protocol):defconnectionMade(self):print'Got connection from', self.transport.clientdefconnectionLost(self, reason):printself.transport.client,'disconnected'defdataReceived(self, data):printdata#实例化Factoryfactory=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的服务器例子:

代码

fromtwisted.internetimportreactorfromtwisted.internet.protocolimportFactoryfromtwisted.protocols.basicimportLineReceiverclassSimpleLogger(LineReceiver):defconnectionMade(self):print'Got connection from', self.transport.clientdefconnectionLost(self, reason):printself.transport.client,'disconnected'deflineReceived(self, line):printline

factory=Factory()

factory.protocol=SimpleLogger

reactor.listenTCP(1234, factory)

reactor.run()

//部分二: 一个server实例

代码

#-*- coding: UTF-8 -*-#Twisted MMORPGfromtwisted.internet.protocolimportFactoryfromtwisted.protocols.basicimportLineOnlyReceiverfromtwisted.internetimportreactorimportrandomimportstringclassGame(LineOnlyReceiver):deflineReceived(self, data):

self.factory.sendAll("%s"%(data))defgetId(self):returnstr(self.transport.getPeer())defconnectionMade(self):print"New User Login:", self.getId()

self.transport.write("欢迎来到MMO世界!\n")

self.factory.addClient(self)defconnectionLost(self, reason):

self.factory.delClient(self)classGameFactory(Factory):

protocol=Gamedef__init__(self):

self.clients=[]

self.player=[]

self.msg=''self.x=range(100,700)

self.y=range(100,500)defgetPlayerId(self):returnlen(self.player)defaddClient(self, newclient):

self.clients.append(newclient)defdelClient(self, client):

self.clients.remove(client)defsendAll(self, data):#print dataifdata.find('')!=-1:

proto.transport.write('\0')else:

arr=data.split(':')

prefix=arr[0]

content=arr[1]ifprefix.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=':::'forposinself.player:

temp.append(string.join(pos,'---'))

playerData=playerData+string.join(temp,'***')forprotoinself.clients:

proto.transport.write('[系统]:'+self.msg+'\n')

proto.transport.write(playerData)elifprefix.find('pos')!=-1:

playerName,x,y=content.split('---')

i=0forpinself.player:ifp[0]==playerName:

p[1]=x

p[2]=yforprotoinself.clients:

proto.transport.write(data)else:

self.msg=dataforprotoinself.clients:

proto.transport.write(self.msg+'\n')

reactor.listenTCP(8006, GameFactory())

reactor.run()

// 部分三一个client例子,与前文不相关

代码

fromtwisted.internet.protocolimportClientCreator, Protocolfromtwisted.protocols.basicimportLineReceiverfromtwisted.internetimportreactorimportsysclassSender(Protocol):defsendCommand(self, command):print"invio", command

self.transport.write(command)defdataReceived(self, data):print"DATA", data

PORT=5005HOST='localhost'defsendCommand(command):deftest(d):print"Invio ->", command

d.sendCommand(command)

c=ClientCreator(reactor, Sender)

c.connectTCP(HOST, PORT).addCallback(test)if__name__=='__main__':iflen(sys.argv)!=2orsys.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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值