<div class="gmail_quote">2012/8/21 Matteo Perini <span dir="ltr"><<a href="mailto:perini.matteo@gmail.com" target="_blank">perini.matteo@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ciao a tutti,<br>
sapete dirmi come fare a controllare la risposta ottenuta durante una comunicazione client-server?<br></blockquote><div><br></div><div>ciao Matteo</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Cerco di spiegare meglio il mio problema.<br>
ho del codice simile a questo:<br>
<br>
s = socket.socket(socket.AF_INET,<u></u>socket.SOCK_STREAM)<br>
s.connect(("192.168.1.102",<u></u>5001))<br>
s.send('comando')<br>
resp = s.recv(1024)<br>
<br>
<br>
dove 1024 dovrebbe essere il numero di caratteri "letti". giusto?<br></blockquote><div><br></div><div>non sono espertissimo di socket, ma 1024 è il numero massimo di byte da leggere e il tutto può essere anche molto frammentato.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Quando invio il comando dovrei ottenere una risposta dal server e solitamente è così.<br>
Il problema è che la risposta resp che ottengo, in qualche caso, appare troncata.<br>
<br>
La risposta deve essere una struttura xml tipo questa:<br>
<server><br>
<var1>TRUE</var1><br>
<var2>TRUE</var2><br>
<var3>FALSE</var3><br>
<var4>TRUE</var4><br>
<var5>FALSE</var5><br>
<var6>55.5</var6><br>
</server><br>
<br>
Se la struttura non arriva completa non posso fare il parsing dell'xml.<br>
<br>
Come posso controllare che la struttura arrivi completa?<br>
Devo controllare le righe iniziale e finale?<br>
Devo svuotare in qualche modo il buffer prima di leggere (non dovrebbe essere pieno!)?<br>
Leggo troppi caratteri?<br></blockquote><div><br></div><div>La mia personale opinione è che qui c'è un problema di astrazioni. A pelle (ma non c'è alcuna dimostrazione matematica o che su questo) ti dico che mi fa strano vedere che gestisci una comunicazione a bassissimo livello (socket) per avere dell'XML. La gestione dei socket è semplice ma la *comunicazione* rischia di essere complessa: devi crearti tu un protocollo di comunicazione per decidere quando un messaggio è finito o no.</div>
<div><br></div><div>O fai un ciclo con dentro la recv, butti tutti i byte in un buffer e termini quando trovi la fine del tag di riferimento, o utilizzi qualche cosa più ad alto livello, magari mediato da un protocollo di comunicazione tipo HTTP o XMLRPC (odio xmlrpc ma usato da python è bellissimo <<a href="http://docs.python.org/library/xmlrpclib.html">http://docs.python.org/library/xmlrpclib.html</a>>), ovviamente c'è l'overhead del protocollo ma qualcosa devi pagare :)</div>
<div><br></div><div>Dai una occhiata anche alle netstring che magari aiutano <<a href="http://en.wikipedia.org/wiki/Netstring">http://en.wikipedia.org/wiki/Netstring</a>></div><div><br></div><div>E comunque dipende sempre tutto da quello che devi fare, nel tuo caso forse c'è bisogno di una comunicazione più da "chat" ovvero botta e risposta (visto come usi i comandi), se vuoi stare comunque basso livello c'è il bellissimissimo modulo `asynchat` che ti può venire in aiuto: definisci i terminatori delle stringhe di comunicazione e asynchat fa il resto.</div>
<div><br></div><div>Ammetto che come risposta non è molto strutturata ma il caldo non aiuta :P</div><div><br></div><div>ciao,</div><div>Alberto</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
E' un problema che si verifica solo ogni tanto e non riesco a trovarne una causa.<br>
Il server è windows il client monta linux.<br>
<br>
Grazie a chiunque mi indichi qualche possibile strategia per evitare questo fastidioso problema.<br>
Ciao<br>
Buon caldo<br>
Matteo<br>
______________________________<u></u>_________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it" target="_blank">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/<u></u>mailman/listinfo/python</a><br>
</blockquote></div><br>