如何创建具有扭曲的可搜索属性的已连接协议的运行列表?

时间:2015-12-16 02:41:30

标签: python tcp server twisted

我尝试创建一个接受TCP连接的服务器,该连接具有当前连接的运行列表。我目前的工厂和协议如下:

class KConnectProtocol(Protocol):
...

    # Adds +1 to the client count whenever a new connection is made, while     
    # also putting a log entry for the client IP and time stamp.
    def connectionMade(self):
        self.client = self.transport.client
        log.msg('K connected from: ' + self.client[0])
        self.factory.numProtocols = self.factory.numProtocols + 1
        log.msg('There are ' + str(self.factory.numProtocols) + ' k connected.')

        self.factory.kList.append(self)
...

class KFactory(ServerFactory):

     # numProtocols keeps track of the number of clients connected to the server at
     # any given point. It's an attribute of the factory so it can be called globally
     protocol = KConnectProtocol
     numProtocols = 0
     kList = []
     uid = []

现在,我希望能够根据每个协议的UID搜索 kList 。即;

k1.uid = 123
k2.uid = 234
k3.uid = 345

kList = (k1, k2, k3)

现在,列表中的每个项目都代表一个唯一的TCP连接。我想在kList中搜索属性" 234"。一旦我确定了对象的索引,我应该能够k2.transport.write("Whoopee")通过该特定的TCP连接发送内容。但是,我遇到了障碍,我不知道在哪里声明该属性,以及列表甚至可以搜索到那个程度。

涵盖我的所有问题如下:

  1. 我会在哪里创建属性(uid),以便每个连接在协议初始化中都有唯一的标识符?
  2. 如何制作可在该属性上搜索的对象(协议)列表?
  3. 我对python和全新的扭曲和网络都很陌生,任何帮助或指向正确的方向都会有所帮助! (作为旁注,我已经广泛搜索了SO并找到了一些答案,但似乎没有任何答案。)

1 个答案:

答案 0 :(得分:0)

我找到了自己的答案,我想在这里发布。

为了为每个协议实例创建一个唯一的名称,我在connectionMade方法中创建了该属性:

class KConnectProtocol(Protocol):

    # Adds +1 to the client count whenever a new connection is made, while
    # also putting a log entry for the client IP and time stamp.
    def connectionMade(self):
        self.client = self.transport.client
        log.msg('K connected from: ' + self.client[0])
        self.factory.numProtocols = self.factory.numProtocols + 1
        log.msg('There are ' + str(self.factory.numProtocols) + ' k connected.')

        self.factory.kList.append(self)

        self.kUID = ""

这会将它作为属性添加到每个实例(连接)中,因此您可以为每个实例设置自己的标识符。

    for x in self.factory.kList:
        if x.kUID == "12345":
            x.transport.write("It works!\n")

在这里,我能够识别特定的连接,并使用该UID将信息发送到该连接。

执行print x.__dict__实际上会打印该实例的所有内容,这就是我的答案。通过工厂跟踪kList,可以使用它来引用特定工厂范围内任何位置的连接。

我仍在努力提高效率,但希望这对其他人也有帮助!