import socket

# Liest Daten, bis der Sender anzeigt, dass er keine weiteren Daten schicken wird
# oder bis die Verbindung vom Sender geschlossen wird.
# Parameter: Socket-Objekt komm_s, von dem gelesen werden soll
# Rückgabewert: gelesene Daten als String (Kodierung utf-8)
def empfangeStr(komm_s):
    weiter = True
    datenBytes = bytes()

    endByte = bytes([0])

    while weiter:
        chunk = komm_s.recv(1)
        if chunk == endByte or chunk == bytes([]):
            weiter = False
        else:
            datenBytes = datenBytes + chunk

    datenStr = str(datenBytes, 'utf-8')

    return datenStr

# Wandelt den String datenStr in ein Bytes-Objekt um (Kodierung utf-8)
# und versendet das Bytes-Objekt über den Kommunikationssocket komm_s
def sendeStr(komm_s, datenStr):
    datenBytes = bytes(datenStr, 'utf-8')
    komm_s.sendall(datenBytes)

# Sendet das TrennByte
# daran erkennt der Empfänger, dass der Sender zunächst keine weiteren Daten sendet
def sendeTrennByte(komm_s):
    trennByte = bytes([0])
    komm_s.sendall(trennByte)
    
# Hauptprogramm    
server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_s.bind(("", 5001))
server_s.listen(20)

while True:
    komm_s, addr = server_s.accept()
    print('Anfrage von ' +  str(addr))
    
    anfrage = empfangeStr(komm_s)
    
    antwort = 'HALLO, ICH BIN EIN SCHREISERVER! ICH SCHREIE EINFACH ALLES ZURÜCK, WAS DU MIR SCHICKST: ' + anfrage.upper() + '!!!'
    
    sendeStr(komm_s, antwort)    

    sendeTrennByte(komm_s)
    
    komm_s.close()