Python Socket Server TCP Status erkennen?
Hi, ich suche jetzt leider schon seit Stunden:
Ich hätte gerne in der Bedingung der While-Schleife irgendetwas stehen was den Status von TCP überprüft, also ob der Client noch anwesend ist, oder nicht, ohne das mit einem Timeout regeln zu müssen.
Geht das?
LG.
import socket
import time
host = '0.0.0.0'
port = 5000
timeout = 5.0
def server_program():
print('listen on: '+host)
ss = socket.socket()
ss.bind((host, port))
ss.listen(5)
(conn, address) = ss.accept()
#WAITNING FOR SOCKET
print("Client: " + str(address))
timestamp = time.time()
while timestamp+timeout>time.time():
c = 0
data = conn.recv(1024*10)
#datay = data.decode()
if not data:
None
else:
#print('return: "'+str(datay)+'"')
conn.send(data)
timestamp = time.time()
time.sleep(0.1)
conn.close()
if __name__ == '__main__':
server_program()
2 Antworten
Du könntest die recv() Methode in der while Schleife verwenden. Die recv() Methode empfängt Daten von einem Client über einen TCP-Socket. Wenn keine Daten empfangen werden, gibt die recv() Methode einen leeren String zurück, was bedeutet, dass der Client nicht mehr anwesend ist.
Um das zu implementieren, könntest du in der while Schleife überprüfen, ob die recv() Methode einen leeren String zurückgibt. Wenn ja, könntest du die Schleife verlassen und die Verbindung schließen. Wenn recv() nicht leer ist, könntest du die empfangenen Daten zurücksenden und den Timestamp aktualisieren, um die Schleife fortzusetzen.
So könntest du das in deinem Code einbauen.
while True:
data = conn.recv(1024*10)
if not data:
break
else:
conn.send(data)
timestamp = time.time()
time.sleep(0.1)
conn.close()
Es freut mich, dass ich dir helfen konnte! Wenn du noch weitere Fragen zu Python oder zu anderen Themen hast, zögere nicht, mich zu fragen. Ich bin immer gerne bereit, zu helfen.
Vielen Dank, darf ich dich als Freund adden?
Es gibt keien Möglichkeit den Status des sockets abzufragen.
try:
data = conn.recv(1024*10)
except TimeoutError:
#cleanup and break.
Danke! Sehr hilfreich! Ich bin heute schon den ganzen Tag dabei aber durschaue das Ding nicht ganz.
Ah, Ok, du scheinst recht zu haben! Ich hatte da wohl einen Denkfehler, da mein Code im Client ja die Verbindung geschlossen hat. Vielen Dank!