Skip to content

Instantly share code, notes, and snippets.

@aurynn
Created April 9, 2014 19:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aurynn/10306913 to your computer and use it in GitHub Desktop.
Save aurynn/10306913 to your computer and use it in GitHub Desktop.
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet import reactor, defer
from twisted.protocols.basic import LineReceiver
import json
your_name = "aurynn"
class JsonProtocol(LineReceiver):
def __init__(self, *args):
# LineReceiver.__init__(self, *args)
self.msgs = {}
self.msgid = 0
def lineReceived(self, msg):
try:
msg = json.loads(msg)
except json.JSONDecoderError:
print "Received a non-JSON message: %s" % msg
if "message" in msg:
print "<{from}> {message}".format(**msg)
elif "acknowledge" in msg:
if not msg["acknowledge"] in self.msgs:
print "We got a bad ack: {id}".format(msg["acknowledge"])
return
id_ = msg["acknowledge"]
print id_
self.msgs[id_]["deferred"].callback(self.msgs[id_]["msg"])
del self.msgs[id_]
else:
print json.dumps(msg,indent=True)
def sendMessage(self, msg):
msg = {
"to": "EchoTest",
"from": your_name,
"message": msg,
"id": self.msgid
}
self.sendLine( json.dumps( msg ) )
df = defer.Deferred()
self.msgs[self.msgid] = {"msg": msg, "deferred": df }
self.msgid += 1
return df
class EchoClientFactory(Factory):
def buildProtocol(self, addr):
return JsonProtocol()
def acknowledge(msg):
print "Message {id} got acknowledged!".format(id=msg["id"])
def on_connect(protocol):
# Remember that a protocol proxies for one wire connection
df = protocol.sendMessage("hello remote server")
df.addCallback(acknowledge)
endpoint = TCP4ClientEndpoint(reactor, "localhost", 1235 )
deferred = endpoint.connect(EchoClientFactory())
deferred.addCallback(on_connect)
reactor.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment