diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -42,33 +42,38 @@ class Server: self.dataFile=None def serve(self): - while self._serveOne(): - pass - - def _serveOne(self): - with Connection(self.ss) as (incoming,outcoming): - jsonData,binData=incoming.readMsg() + while True: + with Connection(self.ss) as (incoming,outcoming): + try: + while True: + if not self._serveOne(incoming,outcoming): return + except AssertionError: + continue - if jsonData["command"]=="init": - assert jsonData["blockSize"]==self.BLOCK_SIZE - assert jsonData["blockCount"]==self.tree.leafCount + def _serveOne(self,incoming,outcoming): + jsonData,binData=incoming.readMsg() - elif jsonData["command"]=="req": - outcoming.writeMsg(*self._requestHash(jsonData)) + if jsonData["command"]=="init": + assert jsonData["blockSize"]==self.BLOCK_SIZE + assert jsonData["blockCount"]==self.tree.leafCount + outcoming.writeMsg({"command": "ack"}) - elif jsonData["command"]=="send" and jsonData["dataType"]=="data": - self._receiveData(jsonData,binData) + elif jsonData["command"]=="req": + outcoming.writeMsg(*self._requestHash(jsonData)) + + elif jsonData["command"]=="send" and jsonData["dataType"]=="data": + outcoming.writeMsg(*self._receiveData(jsonData,binData)) - elif jsonData["command"]=="end": - log.info("closing session...") - if self.dataFile: - self.dataFile.close() - return False + elif jsonData["command"]=="end": + log.info("closing session...") + if self.dataFile: + self.dataFile.close() + return False - else: - assert False, jsonData["command"] + else: + assert False, jsonData["command"] - return True + return True def _requestHash(self,jsonData): log.info("received request for node #{0}".format(jsonData["index"])) @@ -91,4 +96,5 @@ class Server: self.dataFile.write(binData) self._lastWrite=i + return ({"command": "ack", "index": i},) # never update the hash tree