- 论坛徽章:
- 0
|
transport.write有可能在服务端阻塞么?
请大家帮我年看这段代码有什么问题:
#!/usr/bin/env python
# coding=utf-8
from twisted.internet.protocol import Protocol,Factory
from twisted.protocols.basic import LineOnlyReceiver
from twisted.internet import reactor, defer
import pyamf
from pyamf.remoting.gateway.twisted import TwistedGateway
from twisted.web import server, resource
from pyamf.flex import ObjectProxy,ArrayCollection
class Chat(LineOnlyReceiver):
encoding = pyamf.AMF3
def __init__(self):
self.encoder = pyamf.get_encoder(self.encoding)
self.stream = self.encoder.stream
self.username = ''
self.room = 0
def dataReceived(self, data):
stream = pyamf.amf3.decode(data).next() #反序列化
#s = stream["handle"] + " : " + stream["value"]
print (self.getId(), stream)
#print (stream['obj']["method"])
if stream["method"]=="remoteloginsend":
self.setName(stream["loginName"].encode('utf-8'))
s = "欢迎光临, %s\n" % self.getId()
#self.writeObject("remoteloginreceived", s)
self.writeObject("remoteloginreceived",{"Name":self.username,"RoomID":self.room,"welcomeMsg":s})
return
if stream["method"]=="remotechatsend":
print stream["value"]
self.factory.sendAll("remotechatreceived",\
"%s : %s \n" % (self.username, stream["value"].encode('utf-8')),\
self.room)
return
if stream["method"]=="remotegetusersend":
self.factory.sendAll("remotegetusersreceived",self.factory.userlist,self.room)
return
if stream["method"] == "remotegetroomssend":
self.factory.sendAll("remotegetroomsreceived",self.factory.roomlist,self.room)
return
if stream["method"] == "remotechangeroomsend":
temp = self.room
self.room = stream["newRoomID"]
print temp , self.room
self.factory.updataRoom("remotegetusersreceived",temp,self.room)
#self.factory.updataRoom("upRoom",self.room)
return
def getId(self):
return str(self.transport.getPeer())
def connectionMade(self):
self.room = 1
#s = "欢迎光临, %s\n" % self.getId()
#self.writeObject("remoteloginreceived", {"Name":self.username,"RoomID":self.room})
self.factory.clients.append(self)
#self.factory.sendUserlist()
def connectionLost(self, reason):
self.factory.delClient(self)
def setName(self, name):
self.username = name
self.factory.userlist.append(name)
'''
序列化服务端数据
'''
def writeObject(self, handle, message):
x = ObjectProxy({"method":handle, "value":message})
print x
stream = pyamf.encode(x, encoding=pyamf.AMF3) #序列化
#print stream.getvalue()
self.transport.write(stream.getvalue())
self._buffer = ""
class ChatFactory(Factory):
protocol = Chat
def __init__(self):
self.clients = []
self.userlist = []
self.roomlist = ["海滩","山崖","森林","河边"]
#def addClient(self, newclient):
#self.clients.append(newclient)
#def addUserList(self, username):
#self.userlist.append(username)
def delClient(self, client):
self.userlist.remove(client.username)
self.sendAll("remotegetusersreceived",self.userlist,client.room)
self.clients.remove(client)
def updataRoom(self, handle, ordID,newID):
print "oldID : %d newID : %d" % (ordID,newID)##写到这里打包回家了。。。。
ordlist = []
newlist = []
for proto in self.clients:
if proto.room == ordID:
ordlist.append(proto.username)
if proto.room == newID:
newlist.append(proto.username)
for proto in self.clients:
if proto.room == ordID:
proto.writeObject(handle,ordlist)
if proto.room == newID:
proto.writeObject(handle,newlist)
def sendAll(self, handle, message, roomID):
print "roomID : %d" % (roomID)
for proto in self.clients:
if proto.room == roomID:
proto.writeObject(handle,message)
'''
x = ObjectProxy({"method":handle, "value":message})
print x
stream = pyamf.encode(x, encoding=pyamf.AMF3) #序列化
proto.transport.write(stream.getvalue())
'''
class SocketPolicyProtocol(Protocol):
"""
Serves strict policy file for Flash Player >= 9,0,124.
@see: U{http://adobe.com/go/strict_policy_files}
"""
def connectionMade(self):
self.buffer = ''
def dataReceived(self, data):
self.buffer += data
if self.buffer.startswith('<policy-file-request/>'):
self.transport.write(self.factory.getPolicyFile(self))
self.transport.loseConnection()
class SocketPolicyFactory(Factory):
protocol = SocketPolicyProtocol
def __init__(self, policy_file):
"""
@param policy_file: Path to the policy file definition
"""
self.policy_file = policy_file
def getPolicyFile(self, protocol):
return open(self.policy_file, 'rt').read()
reactor.listenTCP(9339, ChatFactory())
reactor.listenTCP(843, SocketPolicyFactory('socket-policy.xml'))
reactor.run() |
|