Klar, weil genau das gemacht wird, was ich Eingangs schon vermutet hatte. Zum Beispiel diese Methode:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit2.Text;
ClientSocket1.Port:=7530;
ClientSocket1.Active:=true;
Button2.Enabled:=false;
Edit2.Enabled:=false;
Button3.Enabled:=true;
Nachricht:=Edit3.Text+' hat den Raum betreten';
delay(500);
ClientSocket1.Socket.SendText(Nachricht);
end;
Die ganzen Socketgeschichten laufen asynchron ab, d.h. du kannst nicht einfach den Socket verbinden lassen (Active := True) und dann einfach ihm 500 Millisekunden Zeit geben und dann eine Nachricht senden. Der Socket kann sonst wie lange brauchen bis er verbunden ist. Du hast doch bestimmt auch schon öfters mal im Internet Server gehabt, die eine Ewigkeit gebraucht haben, bis der Download angefangen hatte. Nun stell dir mal vor, dein Browser würde nach dem anklicken auch nur 500 Millisekunden warten, bis die Datei anfängt zu laden.
Wenn du dem Socket nun sagst, er soll anfangen eine Verbindung aufzubauen (mit Active := True), dann braucht er eine undefinierte Zeit dafür. Daher kannst du die Aktionen mit dem Senden erst machen, wenn der Socket die Verbindung aufgebaut hat und diese steht. Daher kannst du das Socket.SendText() erst machen, wenn du weisst, dass die Verbindung steht. Und wenn der Socket diese Verbindung aufgebaut hat, dann gibt er dir Bescheid und ruft das Ereignis OnConnect auf. In diesem Ereignis kannst du zum ersten Mal Daten senden, weil ab dem Zeitpunkt wo dieses Ereignis ausgelöst wird, die Verbindung steht.
Grundlegend klappt es im LAN, da dort die Reaktionszeit und die Wege sehr kurz, klein und schnell sind. Über das Internet ist es auf Grund der gesamten Topologie immer etwas Zeitaufwendiger, genauso wie in etwas grösseren LANs bzw. WANs, etc. Daher musst du immer auf Ereignisse reagieren und nicht einfach immer nur drauf los arbeiten.