Client skeleton added.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/client.py Thu Jun 17 23:24:41 2010 +0200
1.3 @@ -0,0 +1,64 @@
1.4 +from PySFML import sf
1.5 +import optparse
1.6 +import com
1.7 +import pickle
1.8 +import hashlib
1.9 +import SocketServer
1.10 +
1.11 +class Handler(SocketServer.BaseRequestHandler):
1.12 + """
1.13 + """
1.14 + def handle(self):
1.15 + data = self.request[0]
1.16 + socket = self.request[1]
1.17 + #print "%s wrote:" % self.client_address[0]
1.18 + #print data
1.19 + key_found = False
1.20 + cell = value = None
1.21 + for key, value in com.commands.iteritems():
1.22 + if key in data:
1.23 + key_found = True
1.24 + args = data.partition(key)[2].split()
1.25 + if args:
1.26 + cell, value = value[0](socket, self.client_address, self.worker, args)
1.27 +
1.28 + self.update(cell, value)
1.29 +
1.30 +class Client(SocketServer.UDPServer):
1.31 + def __init__(self, host, port, handler, options, server):
1.32 + SocketServer.UDPServer.__init__(self, (host, port), handler)
1.33 + self.window = sf.RenderWindow(sf.VideoMode(800, 800), "xaoc")
1.34 + self.host = host
1.35 + self.port = port
1.36 + self.handler = handler
1.37 + self.handler.update = self.update
1.38 + self.options = options
1.39 + self.server = server
1.40 + self.cells = {}
1.41 + def update(self, cell, value):
1.42 + event = sf.Event()
1.43 + while self.window.GetEvent(event):
1.44 + if event.Type == sf.Event.Closed:
1.45 + pass
1.46 + self.window.Clear()
1.47 + text = sf.String("x", sf.Font.GetDefaultFont(), 50)
1.48 + for cell in self.cells.iteritems():
1.49 + self.window.Draw(text)
1.50 + self.window.Display()
1.51 + def run(self):
1.52 + self.serve_forever()
1.53 +
1.54 +
1.55 +
1.56 +if __name__ == "__main__":
1.57 + parser = optparse.OptionParser(usage="usage: %prog [options] port server_ip server_port",
1.58 + option_list=option_list)
1.59 + options, args = parser.parse_args()
1.60 +
1.61 + if len(args) > 0:
1.62 + host = "localhost"
1.63 + port = int(args[0])
1.64 + server = (int(args[1]), int(args[2]))
1.65 + client = Client(host, port, Handler, options, server)
1.66 + client.run()
1.67 +
2.1 --- a/com.py Tue Jun 15 14:58:05 2010 +0200
2.2 +++ b/com.py Thu Jun 17 23:24:41 2010 +0200
2.3 @@ -44,6 +44,7 @@
2.4 model.register(socket, client, eventType)
2.5 socket.sendto("observer for event type %s added: " % eventType
2.6 + str(client) + "\n", client)
2.7 + print "observer for event type %s added: " % eventType + str(client) + "\n"
2.8
2.9 def setResolution(socket, client, worker, (modelName, x, y)):
2.10 model = lookupModel(socket, client, modelName)
2.11 @@ -96,6 +97,16 @@
2.12 cells[k] = model.cells[k]
2.13 print "size: %i hash: %s" % (len(cells),
2.14 hashlib.sha256(str(cells)).hexdigest())
2.15 +
2.16 +def data(socket, client, worker, (modelName, cell_r, cell_i, value_r, value_i)):
2.17 + model = lookupModel(socket, client, modelName)
2.18 + cell = complex(float(cell_r), float(cell_i))
2.19 + value = complex(float(value_r), float(value_i))
2.20 + if model:
2.21 + print "received cell " + str(cell) + ": " + str(value)
2.22 + model.cells[complex(cell)] = complex(value)
2.23 + else:
2.24 + return (cell, value)
2.25
2.26 commands = {"help": (help, "help"),
2.27 "create model": (createModel, "creates a new model"),
2.28 @@ -106,4 +117,5 @@
2.29 "set range": (setRange, "sets the model range"),
2.30 "update": (update, "updates the model data"),
2.31 "view": (view, "shows the model data"),
2.32 + "data": (data, "sends data packets"),
2.33 "add observer": (addObserver, "adds an observer to a model's events"),}
3.1 --- a/model.py Tue Jun 15 14:58:05 2010 +0200
3.2 +++ b/model.py Thu Jun 17 23:24:41 2010 +0200
3.3 @@ -38,5 +38,7 @@
3.4 def update(self, max_iter):
3.5 m = algorithm.Mandelbrot(self.range, self.resolution)
3.6 self.cells = m.resolve(max_iter)
3.7 + for cell in self.cells.iteritems():
3.8 + self.dispatch(" ".join(("data", self.name, str(cell[0].real), str(cell[0].imag), str(cell[1].real), str(cell[1].imag))))
3.9
3.10
4.1 --- a/server.py Tue Jun 15 14:58:05 2010 +0200
4.2 +++ b/server.py Thu Jun 17 23:24:41 2010 +0200
4.3 @@ -30,6 +30,8 @@
4.4 else:
4.5 value[0](socket, self.client_address, self.worker)
4.6 if not key_found:
4.7 + print "unkown command: " + data
4.8 + return
4.9 model_name, _, cell_data = data.partition(" ")
4.10 cell = pickle.loads(cell_data)
4.11 #self.cells[cell[0]] = cell[1]
5.1 --- a/worker.py Tue Jun 15 14:58:05 2010 +0200
5.2 +++ b/worker.py Thu Jun 17 23:24:41 2010 +0200
5.3 @@ -25,8 +25,8 @@
5.4 max_iter = int(data[10+model_size:20+model_size])
5.5 model.update(max_iter)
5.6 for cell in model.cells.iteritems():
5.7 - time.sleep(0.01)
5.8 - socket.sendto(model.name + " " + pickle.dumps(cell),
5.9 + socket.sendto(" ".join(("data", model.name, str(cell[0].real),
5.10 + str(cell[0].imag), str(cell[1].real), str(cell[1].imag))),
5.11 self.client_address)
5.12
5.13 class Worker(SocketServer.UDPServer):