diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -1,6 +1,7 @@ import hashlib import socket import ssl +import multiprocessing import logging as log from hashtree import HashTree @@ -28,19 +29,10 @@ class Connection: self._socket.close() -class Server: +class Miniserver: def __init__(self,filename,treeFile=""): self._filename=filename self._treeFile=treeFile - self._locked=False - - if treeFile: - self._tree=HashTree.load(treeFile) - else: - self._tree=HashTree.fromFile(filename) - - self._newLeaves=dict() - self.BLOCK_SIZE=self._tree.BLOCK_SIZE self._ssl=ssl.create_default_context(ssl.Purpose.CLIENT_AUTH,cafile=conf.peers) self._ssl.verify_mode=ssl.CERT_REQUIRED @@ -50,9 +42,36 @@ class Server: self._ss.bind(("", conf.port)) self._ss.listen(1) + def serve(self): + while True: + with Connection(self._ss,self._ssl) as c: + p=multiprocessing.Process(target=Server.run,args=(c,self._filename,self._treeFile)) + p.start() + p.join() + + +class Server: + def __init__(self,connection,filename,treeFile=""): + (self._incoming,self._outcoming)=connection + self._filename=filename + self._treeFile=treeFile + + if treeFile: + self._tree=HashTree.load(treeFile) + else: + self._tree=HashTree.fromFile(filename) + + self._newLeaves=dict() + self.BLOCK_SIZE=self._tree.BLOCK_SIZE + self._lastIndex=-1 self._dataFileHandle=None + @staticmethod + def run(*args): + s=Server(*args) + s.serve() + @property def _dataFile(self): if not self._dataFileHandle: @@ -60,31 +79,27 @@ class Server: return self._dataFileHandle def serve(self): - while True: - with Connection(self._ss,self._ssl) as (incoming, outcoming): - try: - while self._serveOne(incoming,outcoming): - pass - except AssertionError: - continue + try: + while self._serveOne(): pass + except AssertionError as e: + log.warning(e) - def _serveOne(self,incoming,outcoming): - jsonData,binData=incoming.readMsg() + def _serveOne(self): + jsonData,binData=self._incoming.readMsg() if jsonData["command"]=="init": assert jsonData["blockSize"]==self.BLOCK_SIZE assert jsonData["blockCount"]==self._tree.leafCount - self._locked=True - outcoming.writeMsg({"command": "ack"}) + self._outcoming.writeMsg({"command": "ack"}) elif jsonData["command"]=="req": if jsonData["dataType"]=="data": - outcoming.writeMsg(*self._requestData(jsonData["index"])) + self._outcoming.writeMsg(*self._requestData(jsonData["index"])) else: - outcoming.writeMsg(*self._requestHash(jsonData["index"])) + self._outcoming.writeMsg(*self._requestHash(jsonData["index"])) elif jsonData["command"]=="send" and jsonData["dataType"]=="data": - outcoming.writeMsg(*self._receiveData(jsonData,binData)) + self._outcoming.writeMsg(*self._receiveData(jsonData,binData)) elif jsonData["command"]=="end": self._finalize()