2012/8/21 Matteo Perini <perini.mat...@gmail.com> > Ciao a tutti, > sapete dirmi come fare a controllare la risposta ottenuta durante una > comunicazione client-server? >
ciao Matteo > Cerco di spiegare meglio il mio problema. > ho del codice simile a questo: > > s = socket.socket(socket.AF_INET,**socket.SOCK_STREAM) > s.connect(("192.168.1.102",**5001)) > s.send('comando') > resp = s.recv(1024) > > > dove 1024 dovrebbe essere il numero di caratteri "letti". giusto? > non sono espertissimo di socket, ma 1024 è il numero massimo di byte da leggere e il tutto può essere anche molto frammentato. > Quando invio il comando dovrei ottenere una risposta dal server e > solitamente è così. > Il problema è che la risposta resp che ottengo, in qualche caso, appare > troncata. > > La risposta deve essere una struttura xml tipo questa: > <server> > <var1>TRUE</var1> > <var2>TRUE</var2> > <var3>FALSE</var3> > <var4>TRUE</var4> > <var5>FALSE</var5> > <var6>55.5</var6> > </server> > > Se la struttura non arriva completa non posso fare il parsing dell'xml. > > Come posso controllare che la struttura arrivi completa? > Devo controllare le righe iniziale e finale? > Devo svuotare in qualche modo il buffer prima di leggere (non dovrebbe > essere pieno!)? > Leggo troppi caratteri? > 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. 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 < http://docs.python.org/library/xmlrpclib.html>), ovviamente c'è l'overhead del protocollo ma qualcosa devi pagare :) Dai una occhiata anche alle netstring che magari aiutano < http://en.wikipedia.org/wiki/Netstring> 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. Ammetto che come risposta non è molto strutturata ma il caldo non aiuta :P ciao, Alberto > E' un problema che si verifica solo ogni tanto e non riesco a trovarne una > causa. > Il server è windows il client monta linux. > > Grazie a chiunque mi indichi qualche possibile strategia per evitare > questo fastidioso problema. > Ciao > Buon caldo > Matteo > ______________________________**_________________ > Python mailing list > Python@lists.python.it > http://lists.python.it/**mailman/listinfo/python<http://lists.python.it/mailman/listinfo/python> >
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python