2017-01-07 4 views
0

Ich möchte Ihnen eine Frage über eine Störung, die ich während ich codierte, um meine Fähigkeiten in der TCP-Kommunikation zu verbessern. Grundsätzlich lerne ich zuerst über Socket und wie man Server/Client Socket und Kommunikation öffnet. Also schrieb ich eine Klasse für Server und eine für Client, teste ich es und ich fand sie sehr gut funktionieren, was ich kümmern: Das ist der ServerPython TCP-Kommunikation Threaded, Delay und Fehler

class server_class: 
    def __init__(self, sock=None): 
     if sock is None: 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     else: 
      self.sock = sock 
    def bind(self,host, port): 
     self.sock.bind((host, port)) 
    def listen(self,client): 
     self.sock.listen(client) 
    def close_client(self): 
     self.client.close() 
    def accept(self): 
     self.client,self.c_addr=self.sock.accept() 
    def invia(self,MSGLEN,msg): 
     totalsent = 0 
     if(len(msg)<MSGLEN): 
      while(len(msg)<MSGLEN): 
       msg=msg+'*' 
     while totalsent < MSGLEN: 
      sent = self.client.send(msg[totalsent:].encode('ascii')) 
      if sent == 0: 
       raise RuntimeError 
      totalsent = totalsent + sent 
    def ricevi(self,MSGLEN): 
     msg = '' 
     while len(msg) < MSGLEN: 
      chunk = self.client.recv(MSGLEN-len(msg)).decode('ascii') 
      if chunk == '': 
       raise RuntimeError 
      msg = msg + chunk 
     i=0 
     messaggio='' 
     while(i<MSGLEN): 
      if(msg[i]!='*'): 
        mess=msg[i] 
        messaggio=messaggio+mess 

      else: 
        pass 
      i+=1 
     return messaggio 

und dies ist der Kunde:

class client_class: 
    def __init__(self, sock=None): 
     if sock is None: 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     else: 
      self.sock = sock 
    def connect(self,host,port): 
     self.sock.connect((host, port)) 

    def invia(self,MSGLEN,msg): 
     totalsent = 0 
     if(len(msg)<MSGLEN): 
      while(len(msg)<MSGLEN): 
       msg=msg+'*' 
     while totalsent < MSGLEN: 
      sent = self.sock.send(msg[totalsent:].encode('ascii')) 
      if sent == 0: 
       raise RuntimeError 
      totalsent = totalsent + sent 
    def ricevi(self,MSGLEN): 
     msg = '' 
     while len(msg) < MSGLEN: 
      chunk = self.sock.recv(MSGLEN-len(msg)).decode('ascii') 
      if chunk == '': 
       raise RuntimeError 
      msg = msg + chunk 
     i=0 
     messaggio='' 
     while(i<MSGLEN): 
      if(msg[i]!='*'): 
        mess=msg[i] 
      else: 
        pass 
      messaggio=messaggio+mess 
      i+=1 
     return messaggio 

Also überhaupt kein Problem. Der nächste Schritt, den ich versuchte, war, ein Programm zu schreiben, das, während ich etwas Mathe oder GUI oder beides mache, einen Server anmeldet, um einem Kunden die Informationen mitzuteilen, die er zum Beispiel in Mathe ausarbeitet. Die einzige Möglichkeit, dies zu tun, ist das Threading-Modul. Ich schreibe 2 Funktionen, eine für Server und eine für Mathe (erhöhen x Wert in While-Schleife) und fügen Sie in eine GUI. Dann übergebe ich jede Funktion an einen Thread. Diese ist die Server-Funktion (die Nutzung der Serverklasse definiert vorher):

def server(): 

global Stop,x 
server=server_class() 
ip='192.168.1.134' 
port=8033 
server.bind(ip,port) 
Stop=True 
client=0 
c_addr=0 

while(Stop): 
    server.listen(1) 
    print("* inizio ascolto su",ip,":",port) 
    server.accept() 
    print("* mi sono connesso con",server.c_addr[0],":",server.c_addr[1]) 
    while(Stop): 
      data=server.ricevi(100) 
      print(data) 

      if(data=="disconnetti"): 
       msg="bye bye" 
       server.invia(100,msg) 
       server.close_client() 
       print("*disconnetto il client") 
       break 

      if(data=="inviami x"): 
       msg=str(x) 
       server.invia(100,msg) 

      if(data=="chiudi server"): 
       print("*chiudo server") 
       server.close_client() 
       Stop=False 
      else: 
       msg="come?" 
       server.invia(100,msg) 

Dies ist die mathematische Funktion mit dem Namen 'go':

def go(): 
global x 
while(x<10000): 
    x+=1 
    time.sleep(1) 

Schließlich ist die Hauptfunktion ist:

finestra=Tk() 
finestra.geometry('800x800+300+300') 
finestra.title('Prova threading') 
testo_0=Label(finestra,text="Valore attuale:").grid(sticky=W,row=0,column=0) 
gobutton=Button(finestra,text='Acquisisci',command=lambda: leggi()) 
gobutton.grid(row=2, column=1) 

goo=threading.Thread(target=go) 
serv=threading.Thread(target=server) 
goo.start() 
serv.start() 
finestra.mainloop() 

Also gehen Funktion erhöhen kontinuierlich X-Wert, Server-Funktion halten Sie einen Server zu hören und Haupt-Thread behalten eine GUI, in der ein Benutzer X-Wert durch Drücken einer Taste zu sehen. Der Server kennt nur 3 Befehle vom Client: 1) Pass x zum Client 2) schließen Client 3) schließen Sie Server für andere Nachricht, die es als unbekannt Befehl beantworten. Was passiert ist, dass die Kommunikation nicht gut funktioniert; zum Beispiel, wenn von einem Client (läuft auf einem anderen Rechner mit der zuvor definierten Client-Klasse) Frage an den Server, um X-Wert zu übergeben (das gehen Funktion wird ständig erhöht) passieren 2 falsche Dinge: 1) Nach der ersten Kommunikation scheint andere, z Beispiel das zweite Mal, dass ich frage x die Serverantwort als unbekannter Befehl, zum dritten Mal, ich sende eine Anfrage für x Wert gibt mir einen Wert. Das nächste Mal wird es als unbekannt antworten und geben Sie mir einen Wert und so weiter. 2) Auch nach der ersten Kommunikation werden die Werte, die der Server an den Client übergibt, verzögert, also zum Beispiel wenn ich zur Serveranfrage nach x sende und die Unterseite in der GUI für den gelesenen x-Wert drücke, werden das sein deutlich anders.

Dies ist die Client-Skript i verwenden:

import time 
import socket 


class client_class: 
    def __init__(self, sock=None): 
     if sock is None: 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     else: 
      self.sock = sock 
    def connect(self,host,port): 
     self.sock.connect((host, port)) 

    def invia(self,MSGLEN,msg): 
     totalsent = 0 
     if(len(msg)<MSGLEN): 
      while(len(msg)<MSGLEN): 
       msg=msg+'*' 
     while totalsent < MSGLEN: 
      sent = self.sock.send(msg[totalsent:].encode('ascii')) 
      if sent == 0: 
       raise RuntimeError 
      totalsent = totalsent + sent 
    def ricevi(self,MSGLEN): 
     msg = '' 
     while len(msg) < MSGLEN: 
      chunk = self.sock.recv(MSGLEN-len(msg)).decode('ascii') 
      if chunk == '': 
       raise RuntimeError 
      msg = msg + chunk 
     i=0 
     messaggio='' 
     while(i<MSGLEN): 
      if(msg[i]!='*'): 
        mess=msg[i] 
      else: 
        pass 
      messaggio=messaggio+mess 
      i+=1 
     return messaggio 


client=mysocket() 
ip='192.168.1.134' 
port=8033 
client.connect(ip,port) 


while(True): 
    print("inserire comando da inviare (max 100 Bytes)") 
    msg=input().encode('ascii') 
    client.invia(100,msg) 
    print(client.ricevi(100).decode('ascii')) 

Jede Hilfe zu schätzen sein, vielen Dank und sorry für schlechtes Englisch

Antwort

0

UPDATE

ich gefunden, wenn ich Buchse schließen auf jeder Kommunikation, also zum Beispiel jedes Mal, wenn ich eine Nachricht senden muss ich einen Client-Socket öffnen und es nach dem Senden schließen, könnte das Problem lösen, kein Fehler und keine Verzögerung. Kann mir nicht erklären, warum, also wenn jemand antworten könnte, wird es geschätzt. Vielen Dank