Files
@ 8ad57a925d81
Branch filter:
Location: Morevna/src/client.py - annotation
8ad57a925d81
2.2 KiB
text/x-python
optimized some unnecessary disk seeks
59339cfb3d80 59339cfb3d80 59339cfb3d80 59339cfb3d80 59339cfb3d80 6f31f20feb06 6f31f20feb06 59339cfb3d80 59339cfb3d80 92b513293c88 92b513293c88 92b513293c88 6f31f20feb06 6f31f20feb06 92b513293c88 6f31f20feb06 6f31f20feb06 59339cfb3d80 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 59339cfb3d80 59339cfb3d80 6f31f20feb06 92b513293c88 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 59339cfb3d80 6f31f20feb06 6f31f20feb06 92b513293c88 8ad57a925d81 6f31f20feb06 8ad57a925d81 8ad57a925d81 8ad57a925d81 8ad57a925d81 6f31f20feb06 6f31f20feb06 8ad57a925d81 6f31f20feb06 6f31f20feb06 8ad57a925d81 59339cfb3d80 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 59339cfb3d80 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 | from hashtree import HashTree
import collections
import socket
import sys
import config as conf
from networkers import NetworkReader,NetworkWriter
filename=sys.argv[1]
def connect():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((conf.hosts[0], conf.port))
fr=s.makefile(mode='rb')
fw=s.makefile(mode='wb')
networkReader=NetworkReader(fr)
networkReader.start()
networkWriter=NetworkWriter(fw)
networkWriter.start()
incoming=networkReader.output # synchronized message queue
outcoming=networkWriter.input
return (s,incoming,outcoming)
def negotiate(incoming,outcoming):
localTree=HashTree.fromFile(open(filename,mode="rb"))
blocksToTransfer=[]
nodeStack=collections.deque([0]) # root
# initialize session
jsonData={"command":"init", "blockSize":localTree.BLOCK_SIZE, "blockCount":localTree.leafCount, "version":conf.version}
outcoming.put((jsonData,b""))
# determine which blocks to send
while len(nodeStack)>0:
i=nodeStack.pop()
jsonData={"command":"req", "index":i}
outcoming.put((jsonData,b""))
jsonData,binData=incoming.get(timeout=2)
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(outcoming,blocksToTransfer):
print(blocksToTransfer)
dataFile=open(filename,mode="rb")
i1=-1
for i2 in blocksToTransfer:
jsonData={"command":"send", "index":i2, "dataType":"data"}
if i1+1!=i2:
dataFile.seek(i2*HashTree.BLOCK_SIZE)
binData=dataFile.read(HashTree.BLOCK_SIZE)
print("block #{0}: {1}...{2}".format(i2,binData[:5],binData[-5:]))
outcoming.put((jsonData,binData),timeout=2)
i1=i2
jsonData={"command":"end"}
outcoming.put((jsonData,b""),timeout=2)
outcoming.put(None)
print("closing...")
dataFile.close()
if __name__=="__main__":
sock,incoming,outcoming = connect()
blocksToTransfer=negotiate(incoming,outcoming)
sendData(outcoming,blocksToTransfer)
sock.close()
sys.exit(0)
|