From: Vincent Le Gallic Date: Fri, 14 Nov 2014 22:55:10 +0000 (+0100) Subject: Mise à jour du protocole serveur -> client de la NK X-Git-Url: http://gitweb.pimeys.fr/?p=bots%2Fbasile.git;a=commitdiff_plain;h=bf6858eb5f5a79788801fd455837fe8f3f340460 Mise à jour du protocole serveur -> client de la NK --- 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()