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