1 from random import randint
6 from twisted.internet import reactor
7 from twisted.python import log
8 from twisted.web.server import Site
9 from twisted.web.static import File
11 from autobahn.twisted.websocket import WebSocketServerFactory, \
12 WebSocketServerProtocol, \
16 class BroadcastServerProtocol(WebSocketServerProtocol):
19 self.factory.register(self)
21 def onMessage(self, payload, isBinary):
23 #msg = "{} from {}".format(payload.decode('utf8'), self.peer)
24 msg=format(payload.decode('utf8'))
26 if (format(self.peer).find("192.168.5.84")):
27 self.factory.broadcast(msg)
29 def connectionLost(self, reason):
30 WebSocketServerProtocol.connectionLost(self, reason)
31 self.factory.unregister(self)
34 class BroadcastServerFactory(WebSocketServerFactory):
37 Simple broadcast server broadcasting any message it receives to all
38 currently connected clients.
41 def __init__(self, url, debug=False, debugCodePaths=False):
42 WebSocketServerFactory.__init__(self, url, debug=debug, debugCodePaths=debugCodePaths)
44 self.canvasWidth = 1260
48 #row=[None]*self.canvasWidth
49 #for x in range (0,self.canvasWidth):
53 # row[x]={"r": r, "g": g, "b": b}
54 #self.broadcast(json.dumps(row))
55 #reactor.callLater(0.1, self.randomrow)
56 ##return(json.dumps(row))
58 def register(self, client):
59 if client not in self.clients:
60 print("registered client {}".format(client.peer))
61 self.clients.append(client)
63 def unregister(self, client):
64 if client in self.clients:
65 print("unregistered client {}".format(client.peer))
66 self.clients.remove(client)
68 def broadcast(self, msg):
69 #print("broadcasting message '{}' ..".format(msg))
70 for c in self.clients:
71 c.sendMessage(msg.encode('utf8'))
72 #print("message sent to {}".format(c.peer))
75 class BroadcastPreparedServerFactory(BroadcastServerFactory):
78 Functionally same as above, but optimized broadcast using
79 prepareMessage and sendPreparedMessage.
82 def broadcast(self, msg):
83 print("broadcasting prepared message '{}' ..".format(msg))
84 preparedMsg = self.prepareMessage(msg)
85 for c in self.clients:
86 c.sendPreparedMessage(preparedMsg)
87 print("prepared message sent to {}".format(c.peer))
90 if __name__ == '__main__':
92 if len(sys.argv) > 1 and sys.argv[1] == 'debug':
93 log.startLogging(sys.stdout)
98 ServerFactory = BroadcastServerFactory
99 # ServerFactory = BroadcastPreparedServerFactory
101 factory = ServerFactory("ws://localhost:9000",
103 debugCodePaths=debug)
105 factory.protocol = BroadcastServerProtocol
106 factory.setProtocolOptions(allowHixie76=True)