Klassen, Vererbung und Multihtreaded TCP-Server
Verfasst: Sonntag 19. Mai 2013, 19:45
Hi, ich hab da ein *kleines* Problemchen, unter Umständen ist auch mein Lösungsansatz falsch.
Vorweg, was ich mir eigentlich basteln wollte:
- Multithreaded Server, wie hier gezeigt.
- Dabei wäre es schön, wenn MyTCPHandler von socketserver.StreamRequestHandler erbt, damit man dateiähnliche Objekte erhält (Wie hier gezeigt)
- Zudem sollte das Programm solange warten bis ein Thread über Netzwerk den Befehl stop() erhält.
- Und das ganze in eine Klasse verpackt mit ein paar weiteren Funktionen
Ich habe hier ein Minimalbeispiel, welches natürlich nicht funktioniert:
Zum Senden noch die Datei:
Im Moment ist mein größtes Problem eigentlich, dass der Thread, der "stop" übers Netzwerk erhält, dies an die Klasse Test weitergeben soll. Nur wie?
Hat jemand ne Idee?
mfg
Vorweg, was ich mir eigentlich basteln wollte:
- Multithreaded Server, wie hier gezeigt.
- Dabei wäre es schön, wenn MyTCPHandler von socketserver.StreamRequestHandler erbt, damit man dateiähnliche Objekte erhält (Wie hier gezeigt)
- Zudem sollte das Programm solange warten bis ein Thread über Netzwerk den Befehl stop() erhält.
- Und das ganze in eine Klasse verpackt mit ein paar weiteren Funktionen
Ich habe hier ein Minimalbeispiel, welches natürlich nicht funktioniert:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
## Imports
import time
import threading
import socketserver
## Classes
class Test():
def __init__(self):
self.running = False
self.requestStop = False
def update(self):
# update...
pass
def wait(self):
while self.running and not self.requestStop:
time.sleep(5)
if self.requestStop:
self.stopNode()
def startServer(self):
self.running = True
self.server = ThreadedTCPServer(('', 0), ThreadedTCPRequestHandler)
self.serverThread = threading.Thread(target=self.server.serve_forever)
self.serverThread.daemon = True
self.serverThread.start()
print('Port: {}'.format(self.server.server_address[1]))
def stopServer(self):
if self.running == True:
self.server.shutdown()
self.running = False
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = str(self.request.recv(1024), 'utf-8')
if data == 'stop':
# stop server
pass
print(data)
response = bytes('{}'.format(data.upper()), 'utf-8')
self.request.sendall(response)
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
## Application
def main():
t = Test()
t.startServer()
t.update()
t.wait()
return 0
if __name__ == '__main__':
main()Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
## Imports
import sys
import socket
## Application
def main():
port = int(sys.argv[1])
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(('', port))
sock.sendall(bytes('stop', 'utf-8'))
fsock = sock.makefile()
msgLine = fsock.readline()
print(msgLine)
finally:
sock.close()
return 0
if __name__ == '__main__':
main()Hat jemand ne Idee?
mfg