# HG changeset patch # User Eugen Sawin # Date 1276809881 -7200 # Node ID 9147c845cecb83e666d2c2f71d36dcfc69ec2528 # Parent 5ab3cc2e7851e3809216a3a70a8582dbcb67bd2b Client skeleton added. diff -r 5ab3cc2e7851 -r 9147c845cecb client.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client.py Thu Jun 17 23:24:41 2010 +0200 @@ -0,0 +1,64 @@ +from PySFML import sf +import optparse +import com +import pickle +import hashlib +import SocketServer + +class Handler(SocketServer.BaseRequestHandler): + """ + """ + def handle(self): + data = self.request[0] + socket = self.request[1] + #print "%s wrote:" % self.client_address[0] + #print data + key_found = False + cell = value = None + for key, value in com.commands.iteritems(): + if key in data: + key_found = True + args = data.partition(key)[2].split() + if args: + cell, value = value[0](socket, self.client_address, self.worker, args) + + self.update(cell, value) + +class Client(SocketServer.UDPServer): + def __init__(self, host, port, handler, options, server): + SocketServer.UDPServer.__init__(self, (host, port), handler) + self.window = sf.RenderWindow(sf.VideoMode(800, 800), "xaoc") + self.host = host + self.port = port + self.handler = handler + self.handler.update = self.update + self.options = options + self.server = server + self.cells = {} + def update(self, cell, value): + event = sf.Event() + while self.window.GetEvent(event): + if event.Type == sf.Event.Closed: + pass + self.window.Clear() + text = sf.String("x", sf.Font.GetDefaultFont(), 50) + for cell in self.cells.iteritems(): + self.window.Draw(text) + self.window.Display() + def run(self): + self.serve_forever() + + + +if __name__ == "__main__": + parser = optparse.OptionParser(usage="usage: %prog [options] port server_ip server_port", + option_list=option_list) + options, args = parser.parse_args() + + if len(args) > 0: + host = "localhost" + port = int(args[0]) + server = (int(args[1]), int(args[2])) + client = Client(host, port, Handler, options, server) + client.run() + diff -r 5ab3cc2e7851 -r 9147c845cecb com.py --- a/com.py Tue Jun 15 14:58:05 2010 +0200 +++ b/com.py Thu Jun 17 23:24:41 2010 +0200 @@ -44,6 +44,7 @@ model.register(socket, client, eventType) socket.sendto("observer for event type %s added: " % eventType + str(client) + "\n", client) + print "observer for event type %s added: " % eventType + str(client) + "\n" def setResolution(socket, client, worker, (modelName, x, y)): model = lookupModel(socket, client, modelName) @@ -96,6 +97,16 @@ cells[k] = model.cells[k] print "size: %i hash: %s" % (len(cells), hashlib.sha256(str(cells)).hexdigest()) + +def data(socket, client, worker, (modelName, cell_r, cell_i, value_r, value_i)): + model = lookupModel(socket, client, modelName) + cell = complex(float(cell_r), float(cell_i)) + value = complex(float(value_r), float(value_i)) + if model: + print "received cell " + str(cell) + ": " + str(value) + model.cells[complex(cell)] = complex(value) + else: + return (cell, value) commands = {"help": (help, "help"), "create model": (createModel, "creates a new model"), @@ -106,4 +117,5 @@ "set range": (setRange, "sets the model range"), "update": (update, "updates the model data"), "view": (view, "shows the model data"), + "data": (data, "sends data packets"), "add observer": (addObserver, "adds an observer to a model's events"),} diff -r 5ab3cc2e7851 -r 9147c845cecb model.py --- a/model.py Tue Jun 15 14:58:05 2010 +0200 +++ b/model.py Thu Jun 17 23:24:41 2010 +0200 @@ -38,5 +38,7 @@ def update(self, max_iter): m = algorithm.Mandelbrot(self.range, self.resolution) self.cells = m.resolve(max_iter) + for cell in self.cells.iteritems(): + self.dispatch(" ".join(("data", self.name, str(cell[0].real), str(cell[0].imag), str(cell[1].real), str(cell[1].imag)))) diff -r 5ab3cc2e7851 -r 9147c845cecb server.py --- a/server.py Tue Jun 15 14:58:05 2010 +0200 +++ b/server.py Thu Jun 17 23:24:41 2010 +0200 @@ -30,6 +30,8 @@ else: value[0](socket, self.client_address, self.worker) if not key_found: + print "unkown command: " + data + return model_name, _, cell_data = data.partition(" ") cell = pickle.loads(cell_data) #self.cells[cell[0]] = cell[1] diff -r 5ab3cc2e7851 -r 9147c845cecb worker.py --- a/worker.py Tue Jun 15 14:58:05 2010 +0200 +++ b/worker.py Thu Jun 17 23:24:41 2010 +0200 @@ -25,8 +25,8 @@ max_iter = int(data[10+model_size:20+model_size]) model.update(max_iter) for cell in model.cells.iteritems(): - time.sleep(0.01) - socket.sendto(model.name + " " + pickle.dumps(cell), + socket.sendto(" ".join(("data", model.name, str(cell[0].real), + str(cell[0].imag), str(cell[1].real), str(cell[1].imag))), self.client_address) class Worker(SocketServer.UDPServer):