server.py
author Eugen Sawin <sawine@me73.com>
Tue, 15 Jun 2010 14:58:05 +0200
changeset 5 5ab3cc2e7851
parent 4 4cee17e91d29
child 6 9147c845cecb
permissions -rw-r--r--
Added debugging view. Packet loss suspected.
sawine@0
     1
#!/usr/bin/python
sawine@0
     2
sawine@0
     3
import com
sawine@2
     4
import worker
sawine@0
     5
import optparse
sawine@4
     6
import pickle
sawine@4
     7
import hashlib
sawine@2
     8
import subprocess
sawine@0
     9
import SocketServer
sawine@0
    10
sawine@0
    11
option_list = [
sawine@0
    12
	optparse.make_option("-q", "--quiet", action="store_true", dest="quiet", 
sawine@0
    13
		help="quiet mode", default=False)]
sawine@0
    14
	
sawine@0
    15
class Handler(SocketServer.BaseRequestHandler):
sawine@0
    16
	"""
sawine@0
    17
	"""	
sawine@0
    18
	def handle(self):
sawine@4
    19
		data = self.request[0]
sawine@0
    20
		socket = self.request[1]
sawine@5
    21
		#print "%s wrote:" % self.client_address[0]
sawine@5
    22
		#print data
sawine@4
    23
		key_found = False
sawine@0
    24
		for key, value in com.commands.iteritems():
sawine@0
    25
			if key in data:
sawine@4
    26
				key_found = True
sawine@3
    27
				args = data.partition(key)[2].split()				
sawine@0
    28
				if args:
sawine@2
    29
					value[0](socket, self.client_address, self.worker, args)
sawine@0
    30
				else:
sawine@2
    31
					value[0](socket, self.client_address, self.worker)
sawine@4
    32
		if not key_found:
sawine@5
    33
			model_name, _, cell_data = data.partition(" ")
sawine@5
    34
			cell = pickle.loads(cell_data)
sawine@5
    35
			#self.cells[cell[0]] = cell[1]			
sawine@5
    36
			model = com.getModel(model_name)
sawine@5
    37
			#print cell
sawine@5
    38
			model.cells[cell[0]] = cell[1]
sawine@4
    39
			#print hashlib.sha256(str(self.cells)).hexdigest()
sawine@4
    40
			
sawine@0
    41
		
sawine@0
    42
class Server(SocketServer.UDPServer):
sawine@2
    43
	def __init__(self, host, port, handler, options, worker):
sawine@0
    44
		SocketServer.UDPServer.__init__(self, (host, port), handler)
sawine@0
    45
		self.host = host
sawine@0
    46
		self.port = port
sawine@0
    47
		self.handler = handler
sawine@0
    48
		self.options = options
sawine@2
    49
		self.handler.worker = worker
sawine@4
    50
		self.handler.cells = {}
sawine@0
    51
	def run(self):
sawine@0
    52
		self.serve_forever()
sawine@2
    53
sawine@2
    54
def spawnWorker(server, n):
sawine@2
    55
	port = server[1] + 1
sawine@2
    56
	worker_list = [] 
sawine@2
    57
	for i in xrange(n):
sawine@3
    58
		print "starting worker %i" % (port + i)
sawine@2
    59
		#worker.spawn(server[0], port + i)
sawine@3
    60
		subprocess.Popen("python worker.py %i" % (port + i), shell=True)
sawine@2
    61
		worker_list.append((server[0], port + i)) 
sawine@2
    62
	return worker_list		
sawine@2
    63
sawine@0
    64
if __name__ == "__main__":
sawine@2
    65
	parser = optparse.OptionParser(usage="usage: %prog [options] port worker",
sawine@0
    66
		option_list=option_list)
sawine@0
    67
	options, args = parser.parse_args()
sawine@0
    68
	
sawine@0
    69
	if len(args) > 0:
sawine@2
    70
		host = "localhost"
sawine@0
    71
		port = int(args[0])
sawine@2
    72
		worker_count = int(args[1])
sawine@2
    73
		worker = spawnWorker((host, port), worker_count)
sawine@2
    74
		server = Server(host, port, Handler, options, worker)
sawine@0
    75
		server.run()