一个对等对象处理多个客户端

时间:2018-11-04 19:44:56

标签: python tcp client-server twisted

我有一个使用TCP和Twisted的服务器-客户端代码。我希望创建的第一个对等对象(按第一个连接的客户端的顺序)( 发送消息)以及将来的新客户。因此,我保存了第一个对等方(全局列表),并将其用于所有即将进行的连接,但它仅服务于第一个客户端(已连接到),而忽略了其他客户端。

如何使对等方同时为所有连接的客户端提供服务?我将测试不超过3个客户端)。

def connectionMade(self):
            global connectedList
    if self.pt == 'client':
        self.connected = True
    else:                 
        print "Connected from", self.transport.client
        try:
            self.transport.write('<connection up>')
        except Exception, e:
            print e.args[0]
        self.ts = time.time()
        reactor.callLater(5, self.sendUpdate)

    connectedList.append(self.transport) # add peer object




def sendUpdate(self):
            global updateCounter, connectedList
    print "Sending update"
    try:
                    updateCounter += 1
                    print(connectedList[0])
                    # Send updates through first connected peer
                    connectedList[0].write('<update ' + str(updateCounter) + '>')
    except Exception, ex1:
        print "Exception trying to send: ", ex1.args[0]
    if self.connected == True:
        reactor.callLater(5, self.sendUpdate)

1 个答案:

答案 0 :(得分:0)

  

也可以服务(发送消息)将来的客户

这句话很难理解。我的解释是,您希望sendUpdate向所有客户端发送消息,但第一个除外(按连接时的顺序排序)。

  

但它仅服务于第一个客户

这同样困难。我的解释是,您观察到一种行为,即只有第一个客户端(在它们连接时按顺序排序)会收到来自服务器的任何消息。

这是您向客户端发送消息的代码:

connectedList[0].write('<update ' + str(updateCounter) + '>')

请注意,此代码始终向connectedList[0]发送消息。也就是说,它只会向一个客户端发送一条消息-不管有多少个客户端-并且总是选择connectedList中的 first 客户端(对应于第一个连接到服务器的客户端。

您可能想要更多类似的东西:

for c in connectedList[1:]:
    c.write('<update ' + str(updateCounter) + '>')

请注意,这是如何将消息发送到多个客户端的。

此外,与您的问题无关,您应避免使用全局变量,并且应避免使用裸露的ITransport作为协议接口。