@Dav1d Ich will mich nicht mit einer Menge von Tools befassen, wenn ich nur etwas einfaches will. Außerdem ist das Problem gelöst. Ich nehme Steuerzeichen für den Server:
b'\01' bedeutet, der Server soll in eine Loop gehen
b'\00' bedeutet der Server soll aus der Loop wieder heraus
Wenn der Client die nicht verwendet, funktioniert alles wie es vorher war, also nur einmal senden pro Verbindung
Außerdem kann ich mit readline beliebig viel Daten übertragen, also sogar ein mit json umgewandeltes Python Script, wenn ich das wollte. Und bin damit nicht auf feste Buffergrößen angewiesen.
Und mit socketserver.ThreadingMixIn blockiert eine Verbindung nicht die andere, während die eine auf readline wartet.
client.py:
Code: Alles auswählen
import socket
HOST, PORT = "localhost", 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.sendall(b'\x01'+bytes("\n", "utf-8"))
received = sock.recv(16)
while True:
data = input(">")
if len(data) == 0: break
sock.sendall(bytes(data + "\n", "utf-8"))
received = sock.recv(16)
print("Received: {}".format(str(received,"utf-8")))
sock.sendall(b'\x00'+bytes("\n", "utf-8"))
received = sock.recv(16)
sock.close()
server.py:
Code: Alles auswählen
import socketserver
HOST, PORT = "localhost", 9999
def process_data(data):
print(str(data,"utf-8"))
class MyTCPHandler(socketserver.StreamRequestHandler):
def handle(self):
self.data = self.rfile.readline()
print(self.data[0])
if self.data[0] == 1:
self.wfile.write(bytes("OK\n", "utf-8"))
print("Loop start")
while True:
self.data = self.rfile.readline()
if self.data[0] == 0:
self.wfile.write(bytes("OK\n", "utf-8"))
print("Loop exit")
break
else:
process_data(self.data)
self.wfile.write(bytes("OK\n", "utf-8"))
else:
print("No Loop")
process_data(self.data)
self.wfile.write(bytes("OK\n", "utf-8"))
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
allow_reuse_address = True
server = ThreadedTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
TCP ist eben etwas komplizierter als UDP. Bei UDP braucht man keine Threads, weil es da auch keine Verbindungen gibt, die man aufrecht erhalten will - oder auch nicht.
Eine andere Frage: Warum nehmen sie in diesen Beispielen immer eine Membervariable self.data. Man will sie sich ja nicht lange merken und kann dann genauso gut eine lokale Variable nehmen. Was ist schneller eine lokale Variable oder ene Membervariable. Ich erkenne da keinen Nutzen, wenn man eine Membervariable nimmt.