Hi,
seit langer, langer Zeit bastel ich hin und wieder mal an einem Chat-Programm, dass der Fertigstellung mittlerweile sehr nah ist.
Eins der geplanten Features war es, neben Strings (also Texten für den Chat) auch Dateien zu verschicken.
Im OnRead- Ereignis des jeweiligen Sockets (benutze TClient- und TServerSocket) hole ich mir den String immer mit ReceiveText aus dem Socket, und prüfe dann anhand der ersten Zeichen im String ob er für mich bestimmt ist.
Wenn ich jetzt allerdings einen FileStream verschicke (siehe Beispiel auf
SwissDC), befindet sich in der Verbindung ja kein String mehr, wenn OnRead ausgelöst wird.
Kurz zur Funktionsweise: Ich verschicke nicht einfach die Nachrichtentexte, sondern hänge da noch ein paar Sachen davor, davon sind die ersten beiden (durch Trennzeichen abgetrennt) zum einen quasi meine "Plakette" (ein konstant definierter String, von dem zu erwarten ist dass er von keinem anderen Programm an mich geschickt wird) und danach ein Bezeichner für den Typ der Nachricht. Beispielsweise ob jemand online kommt und sich anmeldet (dann steht da "ON"), wenn jemand offline geht ("OFF"), oder obs ne Nachricht für den Chat ist ("MSG").
Eigentlich wollte ich das einfach so machen, dass wenn ich weder Plakette, noch Typ der Nachricht erkenne, einfach auf gut Glück die Daten in einen FileStream schreibe und den dann unter einem gewünschten Dateinamen abspeichere.
Jetzt frage ich mich allerdings, ob das überhaupt ohne
Exception funktionieren kann. Denn ich bin mir nicht ganz darüber im klaren, was Socket.ReceiveText mir am Anfang der Prozedur liefert, wenn der Socket einen FileStream empfängt und keinen String. Gibts dann irgendeinen SocketError, liefert die Funktion mir den Stream als String (also Steuerzeichen etc.), liefert die Funktion einen leeren String, und: Ist der empfangene FileStream nach ReceiveText überhaupt noch da, oder verhält es sich dabei wie mit dem I/O-Result was nach einem Aufruf automatisch auf 0 gesetzt wird?
Oder kann ich tatsächlich einfach zuerst ReceiveText aufrufen, und sofern die Plakette nicht erkannt wurde einfach mit dem FileStream weitermachen?
Danke schonmal,
S - tefano