]> gitweb.pimeys.fr Git - NK2015_Client_Python_Alpha.git/blobdiff - client.py
Màj protocole client/serveur
[NK2015_Client_Python_Alpha.git] / client.py
index 3a722028d9eab00d3248a245b83f3f0a29ecd7fe..610d1239a79ec115da6bbd5a60b4f5e00de14e92 100755 (executable)
--- a/client.py
+++ b/client.py
@@ -19,22 +19,26 @@ from pprint import pprint
 sys.path.append(client_config.rsa_path)
 import monRSA
 
-class DeadServer(Exception):
-    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 DeadServer
+def full_read(socket):
+    """Lit un message complet sur la 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,where,port=None):
     if port==None:
@@ -64,22 +68,22 @@ def checkidentity(a):
         raise KeyboardInterrupt("Imposteur !")
 
 def hello(socket,version):
-    socket.send('hello "%s"'%(version))
+    socket.send('["hello", "%s"]' % (version))
     return lit(a)
 
 def login(socket,user,mdp="",typ="bdd"):
     if user in ["20-100","moibdd","#1"]:
-        a.write('login ["#1","plop","bdd",[[],[],false]]')
+        a.write('["login", ["#1","plop","bdd",[[],[],false]]]')
     elif user in ["vincent","moi"]:
-        a.write('login ["vincent","plop","special",[]]')
+        a.write('["login", ["vincent","plop","special",[]]]')
     elif user in ["toto"]:
-        a.write('login ["toto","plop","bdd",[[],[],false]]')
+        a.write('["login", ["toto","plop","bdd",[[],[],false]]]')
     else:
-        a.write('login ["%s","%s","%s",[[],[],false]]'%(user,mdp,typ))
+        a.write('["login", ["%s","%s","%s",[[],[],false]]]'%(user,mdp,typ))
     return lit(a)
     
 def search(socket,term):
-    a.write("search %s"%(term))
+    a.write('["search", %s]' % (term))
     return lit(a)
 
 def lit(socket):
@@ -92,8 +96,6 @@ def lit(socket):
           return obj["msg"]
     except ssl.SSLError:
         print "Rien à lire"
-    except DeadServer:
-        print "Serveur down ?"
 
 if __name__=="__main__":
     where=raw_input("quel serveur ?")