karavanjo
karavanjo

Reputation: 1751

Twisted: How to send messages by twisted client on single port?

I may send messages to server from twisted client by calling connector.connect(). But clients will be made on different ports. Following code is demonstrated this case:

SERVER_HOST = 'localhost'
SERVER_PORT = '5000'

class EchoClient(protocol.Protocol):
    def connectionMade(self):
        self.transport.write("message")
        self.transport.loseConnection()

class EchoFactory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        print('Connected.')
        return EchoClient()

    def clientConnectionLost(self, connector, reason):
        print('Lost connection.  Reason:', reason)
        connector.connect()


def main():
    reactor.connectTCP(SERVER_HOST, SERVER_PORT, EchoFactory())
    reactor.run()

And my twisted server say me:

Packet received, client 127.0.0.1:41930, size: 7
Connection lost
Packet received, client 127.0.0.1:41931, size: 7
Connection lost
Packet received, client 127.0.0.1:41932, size: 7
Connection lost
Packet received, client 127.0.0.1:41933, size: 7

Clients has different ports - 41930, 41931, etc. How send messages from twisted client with single port?

Upvotes: 0

Views: 296

Answers (1)

notorious.no
notorious.no

Reputation: 5107

You can use the bindAddress parameter in either connectTCP, clientFromString, TCP4ClientEndpoint, or TCP6ClientEndpoint. Using your example, your code would look like:

reactor.connectTCP(SERVER_HOST, SERVER_PORT, EchoFactory(), bindAddress=('127.0.0.1',9999))

I would advise you to avoid this if it's not absolutely necessary because the port may be in use by another process and will cause an exception. It's better for the OS to chose the ip:port for your app to bind to.

Upvotes: 2

Related Questions