Added files, directories and comments.
[sdr-websocket.git] / sdrninja-client / sdrninja / server.py
1 from random import randint
2 import json, time
3
4 import sys
5
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
10
11 from autobahn.twisted.websocket import WebSocketServerFactory, \
12     WebSocketServerProtocol, \
13     listenWS
14
15
16 class BroadcastServerProtocol(WebSocketServerProtocol):
17
18     def onOpen(self):
19         self.factory.register(self)
20
21     def onMessage(self, payload, isBinary):
22         if not isBinary:
23             #msg = "{} from {}".format(payload.decode('utf8'), self.peer)
24             msg=format(payload.decode('utf8'))
25             #print self.peer
26             if (format(self.peer).find("192.168.5.84")):
27                 self.factory.broadcast(msg)
28
29     def connectionLost(self, reason):
30         WebSocketServerProtocol.connectionLost(self, reason)
31         self.factory.unregister(self)
32
33
34 class BroadcastServerFactory(WebSocketServerFactory):
35
36     """
37     Simple broadcast server broadcasting any message it receives to all
38     currently connected clients.
39     """
40
41     def __init__(self, url, debug=False, debugCodePaths=False):
42         WebSocketServerFactory.__init__(self, url, debug=debug, debugCodePaths=debugCodePaths)
43         self.clients = []
44         self.canvasWidth = 1260
45         #self.randomrow()
46
47     #def randomrow(self):
48         #row=[None]*self.canvasWidth
49         #for x in range (0,self.canvasWidth):
50         #  r=randint(0,255)
51         #  g=randint(0,255)
52         #  b=randint(0,255)
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))
57
58     def register(self, client):
59         if client not in self.clients:
60             print("registered client {}".format(client.peer))
61             self.clients.append(client)
62
63     def unregister(self, client):
64         if client in self.clients:
65             print("unregistered client {}".format(client.peer))
66             self.clients.remove(client)
67
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))
73
74
75 class BroadcastPreparedServerFactory(BroadcastServerFactory):
76
77     """
78     Functionally same as above, but optimized broadcast using
79     prepareMessage and sendPreparedMessage.
80     """
81
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))
88
89
90 if __name__ == '__main__':
91
92     if len(sys.argv) > 1 and sys.argv[1] == 'debug':
93         log.startLogging(sys.stdout)
94         debug = True
95     else:
96         debug = False
97
98     ServerFactory = BroadcastServerFactory
99     # ServerFactory = BroadcastPreparedServerFactory
100
101     factory = ServerFactory("ws://localhost:9000",
102                             debug=debug,
103                             debugCodePaths=debug)
104
105     factory.protocol = BroadcastServerProtocol
106     factory.setProtocolOptions(allowHixie76=True)
107     listenWS(factory)
108
109     reactor.run()
110