免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2714 | 回复: 0
打印 上一主题 下一主题

twisted 应用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-29 23:26 |只看该作者 |倒序浏览
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()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP