Twisted中的TCP服务器问题

时间:2010-06-09 08:40:12

标签: python tcp twisted

我正在尝试使用Twisted创建一个简单的TCP服务器,它可以在不同的客户端连接之间进行一些交互。主要代码如下:

#!/usr/bin/env python
from twisted.internet import protocol, reactor
from time import ctime

#global variables
PORT = 22334
connlist = {}    #store all the connections
ids = {}    #map the from-to relationships

class TSServerProtocol(protocol.Protocol):

    def dataReceived(self, data):
        from_id,to_id = data.split('|') #get the IDs from standard client input,which looks like "from_id|to_id"

        if self.haveConn(from_id):    #try to store new connections' informations
            pass
        else:
            self.setConn(from_id)
            self.setIds(from_id,to_id) 

        if to_id in self.csids.keys():                 
             self.connlist[to_id].transport.write(\
             "you get a message now!from %s \n" % from_id)    #if the to_id target found,push him a message.doesn't work as expected
    def setConn(self,sid):
        connlist[sid] = self

    #some other functions

factory = protocol.Factory()
factory.protocol = TSServerProtocol
print 'waiting from connetction...'
reactor.listenTCP(PORT, factory)
reactor.run()

正如所提到的评论,如果出现了新的客户端连接,我会将其连接句柄存储在全局变量connlist中,就像

connlist = {a_from_id:a_conObj,b_from_id:b_conObj,....}

并解析输入,然后在ids中映射其from-to信息。然后我检查ids中是否存在匹配当前“to_id”的密钥。如果是,请使用连接句柄connlist[to_id]并将消息推送到目标连接。但它不起作用。消息只显示在同一个连接中。希望有人可以告诉我一些有关此问题的指示。

谢谢!

1 个答案:

答案 0 :(得分:3)

每次建立TCP连接时,Twisted将创建TSServerProtocol的唯一实例来处理该连接。所以,你只会在TSServerProtocol中看到一个连接。通常,这是您想要的,但可以扩展工厂来执行您尝试在此处执行的连接跟踪。具体来说,您可以继承Factory并覆盖buildProtocol()方法以跟踪TSServerProtocol的实例。 Twisted中所有类之间的相互关系需要一点时间来学习和习惯。特别是,这段standard Twisted documentation应该是你下一次最好的朋友;-)