From bf6858eb5f5a79788801fd455837fe8f3f340460 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Fri, 14 Nov 2014 23:55:10 +0100 Subject: [PATCH] =?utf8?q?Mise=20=C3=A0=20jour=20du=20protocole=20serveur?= =?utf8?q?=20->=20client=20de=20la=20NK?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- nk.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/nk.py b/nk.py index a9e8a5c..7cec40a 100644 --- a/nk.py +++ b/nk.py @@ -34,19 +34,25 @@ class NKUnknownError(NKError): class NKDeadServer(NKError): pass -def full_read(sock): - """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable""" - output = "" - i = 0 - while True: - output += sock.read() - i += 1 - try: - return json.loads(output) - except: - pass - if i == 10 and output == "": - raise NKDeadServer +def full_read(socket): + # On récupère d'abord la taille du message + length_str = '' + char = socket.recv(1) + while char != '\n': + length_str += char + char = socket.recv(1) + total = int(length_str) + # On utilise une memoryview pour recevoir les données chunk par chunk efficacement + view = memoryview(bytearray(total)) + next_offset = 0 + while total - next_offset > 0: + recv_size = socket.recv_into(view[next_offset:], total - next_offset) + next_offset += recv_size + try: + msg = json.loads(view.tobytes()) + except (TypeError, ValueError) as e: + raise NKNotJson("L'objet reçu n'est pas un JSON") + return msg def connect(): sock = socket.socket() -- 2.39.2