diff --git a/src/client.py b/src/client.py --- a/src/client.py +++ b/src/client.py @@ -4,6 +4,7 @@ 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 @@ -53,6 +54,7 @@ class Client: jsonData,binData=incoming.readMsg() assert jsonData["index"]==i assert jsonData["dataType"]=="hash" + stats.logExchangedNode() if localTree.store[i]!=binData: if 2*i+3 length + data=self.stream.readline() assert data + stats.logReceived(data) binLength=int(data.split(b":")[1].strip()) # "bin-length: length" -> length + jsonData=self.stream.read(jsonLength) assert len(jsonData)==jsonLength + stats.logReceived(jsonData) jsonData=json.loads(str(jsonData,encoding="utf-8")) + binData=self.stream.read(binLength) assert len(binData)==binLength + stats.logReceived(binData) return (jsonData,binData) @@ -26,8 +35,10 @@ class NetworkWriter: self.stream=stream def writeMsg(self,*args): - self.stream.write(self.prepMsg(*args)) + msg=self.prepMsg(*args) + self.stream.write(msg) self.stream.flush() + stats.logSent(msg) def prepMsg(self,jsonData,binData=b""): jsonData=bytes(json.dumps(jsonData)+"\n",encoding="utf-8") diff --git a/src/stats.py b/src/stats.py new file mode 100644 --- /dev/null +++ b/src/stats.py @@ -0,0 +1,28 @@ +class Stats: + received=0 + sent=0 + exchangedNodes=0 + transferredBlocks=0 + + +def logReceived(data): + Stats.received+=len(data) + + +def logSent(data): + Stats.sent+=len(data) + + +def logExchangedNode(): + Stats.exchangedNodes+=1 + + +def logTransferredBlock(): + Stats.transferredBlocks+=1 + + +def report(): + return """received {r}B +sent {s}B +exchanged {nodes} hash tree nodes +transferred {blocks} blocks""".format(r=Stats.received, s=Stats.sent, nodes=Stats.exchangedNodes, blocks=Stats.transferredBlocks)