--- /dev/null
+from random import randint
+import json, time
+
+import sys
+
+from twisted.internet import reactor
+from twisted.python import log
+from twisted.web.server import Site
+from twisted.web.static import File
+
+from autobahn.twisted.websocket import WebSocketServerFactory, \
+ WebSocketServerProtocol, \
+ listenWS
+
+
+class BroadcastServerProtocol(WebSocketServerProtocol):
+
+ def onOpen(self):
+ self.factory.register(self)
+
+ def onMessage(self, payload, isBinary):
+ if not isBinary:
+ #msg = "{} from {}".format(payload.decode('utf8'), self.peer)
+ msg=format(payload.decode('utf8'))
+ #print self.peer
+ if (format(self.peer).find("192.168.5.84")):
+ self.factory.broadcast(msg)
+
+ def connectionLost(self, reason):
+ WebSocketServerProtocol.connectionLost(self, reason)
+ self.factory.unregister(self)
+
+
+class BroadcastServerFactory(WebSocketServerFactory):
+
+ """
+ Simple broadcast server broadcasting any message it receives to all
+ currently connected clients.
+ """
+
+ def __init__(self, url, debug=False, debugCodePaths=False):
+ WebSocketServerFactory.__init__(self, url, debug=debug, debugCodePaths=debugCodePaths)
+ self.clients = []
+ self.canvasWidth = 1260
+ #self.randomrow()
+
+ #def randomrow(self):
+ #row=[None]*self.canvasWidth
+ #for x in range (0,self.canvasWidth):
+ # r=randint(0,255)
+ # g=randint(0,255)
+ # b=randint(0,255)
+ # row[x]={"r": r, "g": g, "b": b}
+ #self.broadcast(json.dumps(row))
+ #reactor.callLater(0.1, self.randomrow)
+ ##return(json.dumps(row))
+
+ def register(self, client):
+ if client not in self.clients:
+ print("registered client {}".format(client.peer))
+ self.clients.append(client)
+
+ def unregister(self, client):
+ if client in self.clients:
+ print("unregistered client {}".format(client.peer))
+ self.clients.remove(client)
+
+ def broadcast(self, msg):
+ #print("broadcasting message '{}' ..".format(msg))
+ for c in self.clients:
+ c.sendMessage(msg.encode('utf8'))
+ #print("message sent to {}".format(c.peer))
+
+
+class BroadcastPreparedServerFactory(BroadcastServerFactory):
+
+ """
+ Functionally same as above, but optimized broadcast using
+ prepareMessage and sendPreparedMessage.
+ """
+
+ def broadcast(self, msg):
+ print("broadcasting prepared message '{}' ..".format(msg))
+ preparedMsg = self.prepareMessage(msg)
+ for c in self.clients:
+ c.sendPreparedMessage(preparedMsg)
+ print("prepared message sent to {}".format(c.peer))
+
+
+if __name__ == '__main__':
+
+ if len(sys.argv) > 1 and sys.argv[1] == 'debug':
+ log.startLogging(sys.stdout)
+ debug = True
+ else:
+ debug = False
+
+ ServerFactory = BroadcastServerFactory
+ # ServerFactory = BroadcastPreparedServerFactory
+
+ factory = ServerFactory("ws://localhost:9000",
+ debug=debug,
+ debugCodePaths=debug)
+
+ factory.protocol = BroadcastServerProtocol
+ factory.setProtocolOptions(allowHixie76=True)
+ listenWS(factory)
+
+ reactor.run()
+