Search code examples
pythontcpclient-servertwisted

One peer object handle multiple clients


I have a server-client code using TCP and Twisted. I want the first peer object that is created (by order of the first connected client) to serve (send messages) future upcoming clients as well. So I save the first peer (global list) and I use it for all upcoming connections but it only serves the first client (that it's connected to) while ignoring the others.

How can I make the peer to serve all connected clients simultaneously? (I'll test it for no more than 3 clients).

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)

Solution

  • to serve (send messages) future upcoming clients as well

    This sentence is difficult to understand. My interpretation is that you want sendUpdate to send messages to all of the clients except the first (ordered by when they connected).

    but it only serves the first client

    This is similarly difficult. My interpretation is that you observe a behavior in which only the first client (ordered by when they connected) receives any messages from the server.

    Here is your code for sending messages to clients:

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

    Notice that this code always sends a message to connectedList[0]. That is, it only sends a message to one client - regardless of how many there are - and it always selects the first client in connectedList (which corresponds to the first client to connect to the server).

    You may want something more like this:

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

    Notice how this sends a message to more than one client.

    Also, unrelated to your question, you should eliminate your use of globals and you should avoid using a bare ITransport as your protocol interface.