Kurze Anmerkung zu mjustin und stahli: Man kann natürlich auch vom Server aus blockierend in den Socket schreiben, ohne dass es vorher eine Anfrage des Clients gegeben haben muss. Allerdings kann dann halt bei
Indy, während geschrieben oder sonstwie blockiert wird (vgl. sleep() im Beispiel), keine Nachrichten des Clients empfangen. Prinzipiell geht das zwar mit Sockets mithilfe eines zweiten Threads, aber nicht mit
Indy, weil
Indy nicht threadsafe ist.
Bei
Indy besteht Thread Safety nicht für den Fall, dass aus einem zweiten Thread gleichzeitig aus dem Socket zu lesen oder zu schreiben, während dort bereits ein anderer Thread liest oder schreibt.
Jedoch ist bei
Indy problemlos möglich, auf den Socket aus einem Thread zu lesen, und auf denselben Socket aus einem anderen Thread heraus zu schreiben. Eine Socketconnection, zwei Threads (einer liest Daten, einer sendet Daten).
Beispiel: TIdTelnet, über die Telnet-Serververbindung sendet der Client Daten auf den Socket, während der Client in einem separaten Thread Nachrichten vom Server empfängt. Ein Socket, eine in TIdTelnet enthaltene TIdTCPConnection-Instanz, zwei Threads.
Das ist threadsafe.