Client skeleton added.
authorEugen Sawin <sawine@me73.com>
Thu, 17 Jun 2010 23:24:41 +0200
changeset 69147c845cecb
parent 5 5ab3cc2e7851
child 7 fdf52cc6952f
Client skeleton added.
client.py
com.py
model.py
server.py
worker.py
     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):