`s` ist eine globale Variable, die nicht existieren sollte. `s` ist auch ein extrem schlechter Name für den server_socket.
`init` initialisiert nichts, sondern wartet auf eine Verbindung. Der Funktionsname ist verwirrend.
`q` ist wieder eine globale Variable und kommt in network_recv aus dem Nichts. Die Funktion wird in einem Thread aufgerufen, ein Rückgabewert macht da keinen Sinn.
`t` ist auch ein schlechter Name.
task wird ein einen String gebunden und dann mit Bytes verglichen? Sieht falsch aus.
Das sys.exit ist überflüssig und kann (muß) weg.
Alles unter if __name__ sollte in eine Funktion mit Namen main wandern.
Du bekommst gar nicht mit, ob die Verbindung zum Client wirklich abgebrochen wurde, oder einfach nur langsam ist. Das 1 Sekunde Warten sieht auch nicht sehr robust aus. Entweder kommen die Daten zu schnell, dann läuft die Queue voll, oder zu langsam, dann gibt es einen Fehler.
Mit `task` wird nichts sinnvolles gemacht. Das kann, wie oben schon geschrieben irgendetwas zwischen 1 und 1024 Bytes sein. Robuste Socket-Programmierung sieht anders aus.
Was schickt denn der Client und was soll damit passieren?
Code: Alles auswählen
import time
from threading import Thread
import socket
import queue
BIND_IP = '0.0.0.0'
BIND_PORT = 50000
CONNECTION_CLOSED = "connection_closed"
def wait_for_client(port):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', port)) # Öffne Port
print("Wait of Client ...") # Debugging
server_socket.listen(1)
client, addr = server_socket.accept()
server_socket.close()
return client, addr
def network_recv(queue, conn):
try:
while True:
# TODO: read one message and not only one byte.
# Die 1 ist Absicht, um klar zu machen, dass hier noch was fehlt.
data = conn.recv(1)
queue.put((data))
if not data:
break
except socket.timeout as error:
# TODO: better error handling
print("Fehler net recv ...", error)
queue.put(CONNECTION_CLOSED)
def main():
task_queue = queue.Queue()
client, addr = wait_for_client(BIND_PORT)
Thread(target=network_recv, args=(task_queue, client), daemon=True).start()
while True:
print("Schleife")
try:
task = task_queue.get(False)
print("Recv in Schleife: ", task)
except queue.Empty:
# TODO: was soll hier passieren
time.sleep(1)
else:
if task == CONNECTION_CLOSED:
break
if __name__ == '__main__':
main()