2017-06-15 3 views
0

Ich benutze Socket und Tkinter mit einem Client und Server. Der Server soll Nachrichten an den Client senden, die zu einer Listbox hinzugefügt und dem Benutzer angezeigt werden, während die Nachrichten in Echtzeit empfangen werden. Das Stammfenster wird jedoch erst angezeigt, wenn die Verbindung zum Server unterbrochen wurde (d. H. Das Serverfenster wurde geschlossen). Die Nachrichten werden weiterhin in der Listbox angezeigt, wenn das Stammfenster erscheint erscheint, aber nur nicht, während eine Verbindung besteht. HierDas tkinter-Root-Fenster wird nicht angezeigt, bis die Verbindung zum Server verloren gegangen ist

ist der Server:

import socket 
import sys 


#create a tcp/ip socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

#print(socket.gethostbyname(socket.gethostname())) 

#bind the socket to the port 
server_address = (socket.gethostbyname(socket.gethostname()), 8000) 
print('starting up on {} port {}'.format(*server_address)) 
sock.bind((socket.gethostname(),8000)) 

#listen for incoming connections 
sock.listen(2) 

while True: 
    #wait for connection 
    print('waiting for a connection') 
    connection, client_address = sock.accept() 
    try: 
     print('connection from', client_address) 

     host_name=socket.gethostname() 
     h=("connected to: "+host_name).encode() 
     connection.sendall(h) 
     while True: 
      print("enter a message") 
      m=input().encode() 
      connection.sendall(m) 

    finally: 
     #end the communication 
     connection.close() 

und hier ist der Kunde:

import socket 
import sys 
from tkinter import * 
import tkinter.scrolledtext as tkst 


#create a tcp/ip socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

#connect the socket to the server's port 
server_address = ("10.62.78.168", 8000) 

p=('connecting to {} port {}'.format(*server_address)) 

sock.connect(server_address) 

root=Tk() 
root.title("client") 

log=tkst.ScrolledText(root,width=100) 
log.grid(padx=10,pady=10) 

log.insert(END,p) 

try: 

    while True: 

     p=(sock.recv(1024)).decode() 
     m=("\n<Server> "+p) 
     log.insert(END,m) 

finally: 
    print('closing socket') 
    sock.close() 

root.mainloop() 

Antwort

0

Wenn der Client eine Verbindung zum Socket herstellt, ruft er die while-Schleife des Servers auf. Wie Sie sehen können, wird die Schleife nicht stoppen, bis etwas von innen stoppt. Da es nichts gibt, das es beendet, wird es nur brechen, wenn Ausnahmen auftreten, d. H. Die Verbindung schlägt fehl/fällt ab.

Nur in diesem Moment wird Python weiter fortfahren und die Zeilen ausführen, in denen Sie ein Fenster erstellen.

Wenn Sie die beiden, was passieren soll, gleichzeitig können Sie einen Blick auf Threads haben wollen:

thread.start_new_thread(connect_to_server); 

Wo connect_to_server() eine Funktion definieren Sie sein, um Daten aus der Steckdose zu verbinden und zu lesen.

Auf diese Weise wird die While-Schleife in einem separaten Thread ausgeführt, während der Haupt-Thread zum Erstellen des Fensters fortfährt.

0

Das Fenster wird nicht angezeigt, bis mainloop genannt wird, und Sie haben eine Endlosschleife läuft, bevor mainloop. Die Lösung besteht darin, den aus dem Socket gelesenen Code in einen Thread zu verschieben, damit die GUI nicht blockiert wird. Sie müssen dann eine Thread-sichere Warteschlange für die Kommunikation zwischen dem Arbeitsthread und dem GUI-Thread verwenden.

Verwandte Themen