Files
@ 7cfb47330e47
Branch filter:
Location: Morevna/src/client.py - annotation
7cfb47330e47
2.2 KiB
text/x-python
better logging
59339cfb3d80 59339cfb3d80 59339cfb3d80 59339cfb3d80 7cfb47330e47 59339cfb3d80 6f31f20feb06 6f31f20feb06 59339cfb3d80 59339cfb3d80 92b513293c88 92b513293c88 92b513293c88 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 59339cfb3d80 fa1be84731e2 fa1be84731e2 6f31f20feb06 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 59339cfb3d80 59339cfb3d80 1c3d9df86fb1 92b513293c88 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 1c3d9df86fb1 1c3d9df86fb1 fa1be84731e2 6f31f20feb06 6f31f20feb06 6f31f20feb06 1c3d9df86fb1 1c3d9df86fb1 fa1be84731e2 6f31f20feb06 fa1be84731e2 1c3d9df86fb1 1c3d9df86fb1 6f31f20feb06 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 6f31f20feb06 6f31f20feb06 6f31f20feb06 59339cfb3d80 1c3d9df86fb1 7cfb47330e47 92b513293c88 8ad57a925d81 6f31f20feb06 8ad57a925d81 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 1c3d9df86fb1 6f31f20feb06 7cfb47330e47 6f31f20feb06 fa1be84731e2 1c3d9df86fb1 59339cfb3d80 1c3d9df86fb1 fa1be84731e2 6f31f20feb06 7cfb47330e47 6f31f20feb06 6f31f20feb06 59339cfb3d80 6f31f20feb06 1c3d9df86fb1 1c3d9df86fb1 6f31f20feb06 6f31f20feb06 | from hashtree import HashTree
import collections
import socket
import sys
import logging as log
import config as conf
from networkers import NetworkReader,NetworkWriter
filename=sys.argv[1]
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()
def negotiate():
localTree=HashTree.fromFile(open(filename,mode="rb"))
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<len(localTree.store): # inner node
nodeStack.append(2*i+2)
nodeStack.append(2*i+1)
else: blocksToTransfer.append(i-localTree.leafStart) # leaf
return blocksToTransfer
def sendData(blocksToTransfer):
log.info(blocksToTransfer)
dataFile=open(filename,mode="rb")
i1=-1
for i2 in blocksToTransfer:
with Connection() as (incoming,outcoming):
jsonData={"command":"send", "index":i2, "dataType":"data"}
if i1+1!=i2:
dataFile.seek(i2*HashTree.BLOCK_SIZE)
binData=dataFile.read(HashTree.BLOCK_SIZE)
log.info("block #{0}: {1}...{2}".format(i2,binData[:5],binData[-5:]))
outcoming.writeMsg(jsonData,binData)
i1=i2
with Connection() as (incoming,outcoming):
outcoming.writeMsg({"command":"end"})
log.info("closing session...")
dataFile.close()
if __name__=="__main__":
blocksToTransfer=negotiate()
sendData(blocksToTransfer)
sys.exit(0)
|