[Twisted-Python] Simple bidirectional Socket Client

Raketenschnitzel raketenschnitzel at gmx.de
Fri Jun 14 06:11:20 MDT 2013


Hi there,

i'm new to twisted, but i want to use it in a project for dealing with 
the socket connection to a server for receiving and sending data.
I already did some projects in Delphi and there you have an build-in 
eventdriven socket class. Python itself lacks at this feature (afaik) 
and so i stumpled upon twisted. Since its only a small part of my task, 
im looking for an easy solution but after consulting google for two days 
and testing around im still failing at get it working.

What i got so far:

class ControllerProtocol(Protocol):

     def connectionMade(self):
         # send Greeting
         self.factory.isConnected = True
         self.transport.write("hello, world!")

     def dataReceived(self, data):
         "Parse received data and send corresponding Message."
         self.transport.write(self.factory.reactOnReceive(data))

     def connectionLost(self, reason):
         #try to reconnect
         self.factory.isConnected = False
         print "connection lost"

     def sendMessage(self, data):
         print 'Send:', data
         self.transport.write(data)

class Communicator(ClientFactory):
     protocol = ControllerProtocol

     def __init__(self, Host, Port):
         if isinstance(Host, str) and isinstance(Port, int) :
             self.myHost = Host
             self.myPort = Port
             self.isConnected = False
             print 'Going To connect'
             self.connectToMother()

     def connectToMotherShip(self):
         reactor.connectTCP(self.myHost, self.myPort, self)
         reactor.run()

     def buildProtocol(self, addr):
         p = ClientFactory.buildProtocol(self, addr)
         self.connectedProtocol = p
         return p

     def sendMessage(self, Message):
         self.connectedProtocol.SendMessage(Message)

     def reactOnReceive(self, String):
         #here i parse the received string for different requests after 
converting it to json and update values of the operator
         pass

class Operator:
     def __init__(self):
     self.myCommunicator = Communicator("192.168.1.12", 815)
     do other stuff ...

I want an Operator Object that builds the Communicator. The communicator 
updates values of the Operator asynchronously if it receives messages. 
Each 10 secs the Operator will initiate a Communicator.sendMessage to 
send a status information to the server.

Two questions:
1) Is it possible to solve my task like this with twisted and if so, how 
do I get my Communicator to not block my Operator?
2) If twisted is not the easiest way for this approach, do i have 
alternatives? I want at least something event driven. I also read about 
the asyncore packages, but people often recommend twisted over asyncore.

I simply want to send and receive message with a "threaded" communicator 
class, while doing other stuff in my Operator.

Thanks a lot for your help,
Toni





More information about the Twisted-Python mailing list