from hashtree import HashTree import collections import socket import sys import logging as log import config as conf 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): 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) # determine which blocks to send while len(nodeStack)>0: with Connection() as (incoming,outcoming): i=nodeStack.pop() outcoming.writeMsg({"command":"req", "index":i}) jsonData,binData=incoming.readMsg() assert jsonData["index"]==i assert jsonData["dataType"]=="hash" if localTree.store[i]!=binData: if 2*i+3