diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -4,6 +4,8 @@ from networkers import NetworkReader,Net import collections import sys +import config as conf + # debug copy default file import shutil origFilename=sys.argv[1] @@ -11,67 +13,74 @@ filename=origFilename+"_" shutil.copyfile(origFilename,filename) +class Connection: + def __init__(self,server_socket): + self.socket, address = server_socket.accept() + print('Connected by', address) + fr=self.socket.makefile(mode="rb") + fw=self.socket.makefile(mode="wb") + + networkReader=NetworkReader(fr) + networkReader.start() + networkWriter=NetworkWriter(fw) + networkWriter.start() + + self.incoming=networkReader.output # synchronized message queue + self.outcoming=networkWriter.input + + def __enter__(self): + return self.incoming,self.outcoming + + def __exit__(self, exc_type, exc_val, exc_tb): + self.socket.close() + + localTree=HashTree.fromFile(open(filename,mode="rb")) -HOST = '' # Symbolic name meaning all available interfaces -PORT = 50009 # Arbitrary non-privileged port -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.bind((HOST, PORT)) -s.listen(1) -conn, addr = s.accept() -print('Connected by', addr) -fr=conn.makefile(mode="rb") -fw=conn.makefile(mode="wb") - -networkReader=NetworkReader(fr) -networkReader.start() -networkWriter=NetworkWriter(fw) -networkWriter.start() +ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +ss.bind(("",conf.port)) +ss.listen(1) blocksToTransfer=[] nodeStack=collections.deque([0]) -incoming=networkReader.output # synchronized message queue -outcoming=networkWriter.input i1=-1 while True: - jsonData,binData=incoming.get(timeout=2) - dataFile=open(filename,mode="rb+") - - if jsonData["command"]=="init": - assert jsonData["blockSize"]==localTree.BLOCK_SIZE - assert jsonData["blockCount"]==localTree.leafCount - - elif jsonData["command"]=="req": # !! index out of range - print("received request for node #{0}".format(jsonData["index"])) - nodeHash=localTree.store[jsonData["index"]] - - jsonResponse={"command":"send", "index":jsonData["index"], "dataType":"hash"} - binResponse=nodeHash - - outcoming.put((jsonResponse,binResponse),timeout=2) - - elif jsonData["command"]=="send" and jsonData["dataType"]=="data": # needlessly allow hashes and data in mixed order - print("received data block #{0}: {1}...{2}".format(jsonData["index"],binData[:5],binData[-5:])) + with Connection(ss) as (incoming,outcoming): + jsonData,binData=incoming.get(timeout=2) + dataFile=open(filename,mode="rb+") + + if jsonData["command"]=="init": + assert jsonData["blockSize"]==localTree.BLOCK_SIZE + assert jsonData["blockCount"]==localTree.leafCount + + elif jsonData["command"]=="req": # !! index out of range + print("received request for node #{0}".format(jsonData["index"])) + nodeHash=localTree.store[jsonData["index"]] + + jsonResponse={"command":"send", "index":jsonData["index"], "dataType":"hash"} + binResponse=nodeHash + + outcoming.put((jsonResponse,binResponse),timeout=2) - i2=jsonData["index"] - if i1+1!=i2: - dataFile.seek(i2*localTree.BLOCK_SIZE) - dataFile.write(binData) - i1=i2 - - # never update the hash tree - - elif jsonData["command"]=="end": - print("closing...") - break + elif jsonData["command"]=="send" and jsonData["dataType"]=="data": # needlessly allow hashes and data in mixed order + print("received data block #{0}: {1}...{2}".format(jsonData["index"],binData[:5],binData[-5:])) + + i2=jsonData["index"] + if i1+1!=i2: + dataFile.seek(i2*localTree.BLOCK_SIZE) + dataFile.write(binData) + i1=i2 + + # never update the hash tree + + elif jsonData["command"]=="end": + print("closing...") + break - else: pass # !! error + else: pass # !! error -# fr.close() -# fw.close() dataFile.close() -conn.close() sys.exit(0)