Ich schreibe gerade an einem Multithreading Server und habe ein Problem.
Mein Programm startet zunächst einen Server in einem eigenen Thread und startet danach ein Interface.
Das Problem besteht darin, dass der Serverthread sich beim Beenden des Interface mit schließen soll.
Dazu habe ich eine Variable erstellt, welche zunächst auf True gesetzt ist und beim Beenden auf False gesetzt wird.
Leider wird der Serverthread nach dem Schließen des Interface trotzdem nicht beendet und ich muss es über das Terminal abwürgen.
Mein Server:
Code: Alles auswählen
class Server(threading.Thread):
def __init__(self, host_ip='', host_port=5007):
threading.Thread.__init__(self)
self.host = host_ip
self.port = host_port
self.clients = []
self.ip = ""
self.server = None
self.msg = ""
self.running = True
@staticmethod
def message(msg):
print "[%s]: %s" % (strftime('%H:%M:%S', gmtime()), msg)
def run(self):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.host, self.port))
self.server.listen(1)
try:
self.message("Server initialized!")
while 1:
if serv.running = False:
exit()
write, read, oob = select.select([self.server]+self.clients, [], [])
#iter through all sockets
for sock in write:
if sock is self.server:
client, addr = self.server.accept()
self.clients.append(client)
self.message("New Client(%s) connected!" % addr[0])
interface.new_client(str(addr[0]))
else:
self.msg = sock.recv(1024)
self.ip = sock.getpeername()[0]
if self.msg:
self.message("[%s] %s" % (self.ip, self.msg))
else:
self.message("Connection from %s closed" % self.ip)
interface.remove_client(self.ip)
sock.close()
self.clients.remove(sock)
finally:
for c in self.clients:
c.close()
self.server.close()
Code: Alles auswählen
def run(self):
self.header()
self.get_client_list()
#Display loaded Clients from File
for client in self.clients:
self.create_client(client)
#Main Interfacebuttons
Tkinter.Button(self.root, text="Run Actions", command=self.do_actions).place(x=530, y=420)
Tkinter.Button(self.root, text="EXIT", command=self.save_clients).place(x=675, y=420)
self.root.mainloop()
def save_clients(self):
"""Save Clients to clients.txt file to have access on further runs"""
try:
with open("clients.txt", "w") as client_log:
for c in self.clients:
client_log.write(c)
except IOError:
Server.message("Error writing Clients to File!")
#Close Interface
serv.running = False
self.root.destroy()
Code: Alles auswählen
#Create Server Instance
serv = Server()
#Start server in own Thread
serv.start()
interface = Interface()
#Start server interface
interface.run()
Lg Hobbit