Skip to content

Instantly share code, notes, and snippets.

@aurynn
Created April 9, 2014 20:02
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/10308710 to your computer and use it in GitHub Desktop.
Save aurynn/10308710 to your computer and use it in GitHub Desktop.
# Shamelessly stolen from the Twisted site
from twisted.internet import protocol, reactor, defer
from twisted.protocols.basic import LineReceiver
from twisted.internet.endpoints import TCP4ServerEndpoint
import json
class JsonEchoServer(LineReceiver):
"""
Implements the server-side mechanisms
"""
def __init__(self, *args):
# LineReceiver.__init__(self, *args)
self.acks = {}
self.msgid = 0
def connectionMade(self):
print "Connected!"
msg = {"from": "server",
"message": "connected",
"id": self.msgid}
self.sendLine(json.dumps(msg))
self.acks[self.msgid] = msg
self.msgid += 1
def lineReceived(self, line):
"""Receives a line from our remote"""
print "Line!"
m = None
try:
m = json.loads(line)
except json.JSONDecodeError as e:
self.sendLine(json.dumps(
{
"from": "server",
"message": "json parse error {error}".format(e),
"addr": self.addr
}
))
print "received non-json-decodable string"
return
self.sendLine(json.dumps({"acknowledge": m["id"]}))
self.sendLine(json.dumps(
{ "from": "EchoServer", "message": "%s said '%s'" % ( m["from"], m["message"] ) }
)
)
self.relay(m)
def send(self, msg):
self.sendLine(json.dumps(msg))
class EchoFactory(protocol.Factory):
def __init__(self, *args):
self.peers = []
def buildProtocol(self, addr):
e = JsonEchoServer()
e.addr = addr
e.factory = self
self.peers.append(
{"addr": addr,
"proto": e}
)
return e
def relay(self, msg, origin):
for peer in peers:
if peer["addr"] == origin:
continue
peer["proto"].send(msg)
endpoint = TCP4ServerEndpoint(reactor, 1235)
endpoint.listen(EchoFactory())
reactor.run()
@aurynn
Copy link
Author

aurynn commented Apr 9, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment