Mise à jour effectuée, merci de nous signaler tout dysfonctionnement ! | Upgrade done, please let us know about any dysfunction!

Commit 548475ec authored by ZettaScript's avatar ZettaScript
Browse files

Protocol

parent 35532d12
......@@ -7,6 +7,7 @@ Le serveur permettra d'héberger plusieurs parties, afin d'épargner aussi aux a
N'hésitez pas à me contacter si vous avez des idées ou des critiques concernant le principe ou ma manière d'implémenter, de coder... Il faut adapter les règles du jeu au support informatique, ce qui nécessite de faire des choix (par exemple, j'ai décidé de remplacer le système de billets par une valeur numérique, mais je garde le roulement des valeurs).
## Documentation
La classe `Game` représente une partie, et peut servir pour toute la durée d'un jeu, pour plusieurs systèmes monétaires.
La partie serveur, pour les interactions, ainsi que le système d'échanges ne sont pas encore implémentés. La classe de la monnaie dette non plus.
Le système de roulement des valeurs est aussi à faire.
......@@ -36,6 +37,15 @@ Exemple :
Le fichier `testclient.py` est un client temporaire pour tester le serveur en développement.
### Protocole
Le protocole utilisé entre clients et serveur est très simple.
VERSION/LANG/LENGTH\nDATA
**VERSION** étant la version du protocole utilisée pour le paquet, **LANG** le langage utilisé pour coder les données, **LENGTH** la taille des données, **DATA** les données.
Pour le moment, seul le JSON est utilisé.
## Sources
http://www.trm.creationmonetaire.info/TheorieRelativedelaMonnaie.pdf
......
......@@ -217,21 +217,32 @@ Options:\n\
print("Server started at "+str(server_address))
while loop:
client, addr = sock.accept()
client.settimeout(5)
paquet = b""
lf = 0
# TODO: taille des données indiquée en début de paquet plutôt que \n\n pour trouver EOT
while lf < 2:
raw = client.recv(RECBUF)
p_len_tmp = ""
p_len = None
p_data_index = None
i = 0
while True:
try:
raw = client.recv(RECBUF)
except socket.timeout:
break
if raw:
paquet += raw
if lf >= 0:
for c in raw:
for c in raw:
if p_len == None:
if c == 10:# LF
lf += 1
elif c != 13:# CR
lf = 0
if lf > 1:
h = 0
p_len = int(p_len_tmp, 16)
p_data_index = len(paquet)+1
elif (c >= 48 and c <= 57) or (c >= 97 and c <= 102) or (c >= 65 and c <= 70):# [0-9a-fA-F]
p_len_tmp += chr(c)
else:
p_len_tmp = ""
else:
i += 1
paquet += bytes([c])
if p_len != None and i >= p_len:
break
else:
break
......@@ -251,16 +262,13 @@ Options:\n\
continue
p_lng = paquet[seps[0]+1:seps[1]]# data language
p_mod = chr(paquet[seps[1]+1])# mode
p_data_expected = p_mod in "pPQ"# if data expected
p_resp = p_mod in "IPQS"# if response expected by client
resp_raw = b""# raw response
resp = None# response
resp_lng = ""# response language
if p_data_expected:
p_raw = paquet[seps[2]+1:]
if p_len > 0:
p_raw = paquet[p_data_index:]
if p_lng == b"json":
try:
......
......@@ -57,7 +57,8 @@ while True:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_address)
msg = PROTOCOL_VERSION+b"/"+PROTOCOL_LANG+b"/p\n"+json.dumps(data).encode()+b"\n\n"
raw = json.dumps(data).encode()
msg = PROTOCOL_VERSION+b"/"+PROTOCOL_LANG+b"/"+hex(len(raw))[2:].encode()+b"\n"+raw
sock.sendall(msg)
resp = sock.recv(BUFFER)
print(resp)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment