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