import collections import socket import logging as log from datetime import datetime import config as conf import stats from util import Progress from hashtree import HashTree from networkers import NetworkReader,NetworkWriter class Connection: def __init__(self): self.socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.socket.connect((conf.hosts[0], conf.port)) fr=self.socket.makefile(mode="rb") fw=self.socket.makefile(mode="wb") self.incoming=NetworkReader(fr) self.outcoming=NetworkWriter(fw) def __enter__(self): return self.incoming,self.outcoming def __exit__(self, exc_type, exc_val, exc_tb): self.socket.close() class Client: def __init__(self,filename): self.filename=filename def negotiate(self): print(datetime.now(), "initializing...") localTree=HashTree.fromFile(self.filename) blocksToTransfer=[] nodeStack=collections.deque([0]) # root # initialize session with Connection() as (incoming,outcoming): jsonData={"command":"init", "blockSize":localTree.BLOCK_SIZE, "blockCount":localTree.leafCount, "version":conf.version} outcoming.writeMsg(jsonData) jsonData,binData=incoming.readMsg() assert jsonData["command"]=="ack" # determine which blocks to send print(datetime.now(), "negotiating:") progress=Progress(localTree.leafCount) while len(nodeStack)>0: i=nodeStack.pop() outcoming.writeMsg({"command":"req", "index":i}) jsonData,binData=incoming.readMsg() assert jsonData["index"]==i assert jsonData["dataType"]=="hash" stats.logExchangedNode() if localTree.store[i]!=binData: if 2*i+3