So I have two choices: I run the reactor in a separate thread, or I find a way to do a non-blocking communication using onReceive/onSend events.
no you don't understand the bigger picture with Twisted, it is a hollywood system, "Don't call us, we'll call you". If you would stop for a minute, take a step back and go READ about ZeroConf/Apple Rendezvous and then look at the mDNS implementations in Python you might understand you are doing things backwards. You register callbacks with Twisted, it calls them when it needs to you. Read about the Application and Service objects, what you want to do is more than is in the tutorial and examples. My suggestion is to DO the entire Echo how-to over and over until you "get it" about the Application and Service interfaces and objects and the .tac file concept.