Added files, directories and comments.
[sdr-websocket.git] / sdrninja-client / sdrninja / server.py
diff --git a/sdrninja-client/sdrninja/server.py b/sdrninja-client/sdrninja/server.py
new file mode 100644 (file)
index 0000000..2b434f5
--- /dev/null
@@ -0,0 +1,110 @@
+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()
+