import socket

class ISocket:
    def __init__(self, komm_s=False):
        if komm_s:
            self.komm_s = komm_s
        else:
            self.komm_s = None

    def verbinden(self, ip, port):
        self.komm_s = socket.socket()
        adresse = (ip, port)
        self.komm_s.connect(adresse)
    
    def sendeBytes(self, bytesAsList):
        bytesAsBytesObject = bytes(bytesAsList)
        self.komm_s.sendall(bytesAsBytesObject)
    
    def sendeString(self, string):
        bytesAsList = []
        for char in string:
            bytesAsList = bytesAsList + [ord(char)]
        self.sendeBytes(bytesAsList)

    def empfangeBytesBis(self, endByte):
        weiter = True
        daten = []

        endByteBytesObj = bytes([endByte])

        while weiter:
            chunk = self.komm_s.recv(1)
            if chunk == endByteBytesObj or chunk == bytes([]):
                weiter = False
            else:
                
                daten = daten + [chunk[0]]
        
        return daten
    
    def empfangeStringBis(self, endByte):
        bytesAsList = self.empfangeBytesBis(endByte)
        string = ''
        for byte in bytesAsList:
            string = string + chr(byte)
        return string
            

    def trennen(self):
        self.komm_s.close()


class IVerbindungsSocket:
    def __init__(self):
        self.verbindungs_s = socket.socket()

    def anPortBinden(self, port):
        self.verbindungs_s.bind(('', port))
        self.verbindungs_s.listen(20)
    
    def verbindungAnnehmen(self):
        komm_s, client_adresse = self.verbindungs_s.accept()
        return ISocket(komm_s)

    def trennen(self):
        self.verbindungs_s.close()