Files
@ 5f1426df68a7
Branch filter:
Location: Morevna/src/client.py - annotation
5f1426df68a7
2.1 KiB
text/x-python
deleted obsolete file
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 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 6f31f20feb06 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")
for i in blocksToTransfer:
jsonData={"command":"send", "index":i, "dataType":"data"}
dataFile.seek(i*HashTree.BLOCK_SIZE)
binData=dataFile.read(HashTree.BLOCK_SIZE)
print("block #{0}: {1}...{2}".format(i,binData[:5],binData[-5:]))
outcoming.put((jsonData,binData),timeout=2)
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)
|