Interrompre la connexion d'un socket commandé par un GUI
Bonjour,
(J'ai posté ce message sur une autre discussion et il m'a été conseillé d'en ouvrir une nouvelle)
J'essaye de faire un GUI côté serveur ; est-il possible de faire une interface graphique autour du serveur avec un bouton 'Quit' (en Tkinter) qui interromps la connexion ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import tkinter as tk
import socket
HOSTPORT = ('localhost',1234)
BUFSIZE = 1024
CODE = 'utf8'
class App(tk.Tk) :
def __init__(self) :
tk.Tk.__init__(self)
self.geometry('100x100')
# Create socket
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind(HOSTPORT)
# Start connection
button = tk.Button(self, text='Listen', command=self.listen)
button.pack()
# Close GUI, even if connection opened
button = tk.Button(self, text='Close program', command=self.destroy)
button.pack()
def listen(self) :
while True :
self.socket.listen(5)
conn, address = self.socket.accept()
data = conn.recv(BUFSIZE)
print('Client says %s'%data.decode(CODE))
conn.close()
self.socket.close()
app = App()
app.mainloop() |
Je suis bloqué par la boucle infinie qui bloque ma fenêtre graphique, et en particulier le bouton 'Close program' que je souhaitais avoir à disposition pour arrêter "d'écouter".
Est-il nécessaire de créer un client "local" pour piloter le serveur (local également) et utiliser le module select pour que le serveur écoute simultanément les instruction de l'opérateur (côté serveur) et du client (potentiellement machine distante) ?
Je me considère comme plutôt à l'aide avec le module Tkinter mais les projets que j'ai eu jusqu'à présent n'ont jamais impliqué les modules socket, select et thread que je découvre depuis quelques jours...
Bien cordialement !