HSG |
|
In den RFCs ist ein Socket als ein Tupel aus Ziel- und Quell-IP-Adresse,
Ziel- und Quell-Port und Netzwerkprotokoll beschrieben.(aus wikipedia)
Der Ziel-Port wählt einen bestimmten Dienst aus, der Quell-Port wird zufällig generiert. Auf diese Weise sind mehrere
Verbindungen zu einem Dienst zwischen zwei Rechnern möglich.
Wir benutzen ein Socket als eine Software-Schnittstelle zum Zweck der Nutzung einer bidirektionalen
Verbindung zwischen Computern. Diese Schnittstelle wird in objektorientierten Sprachen als
ein spezielles Objekt auftreten, das die Handhabung erleichtert.
In den folgenden Beispielen wird die Klasse TWSocket von
Francois Piette
verwendet, die wiederum Windows-Api-Funktionen kapselt. Nebenstehendes Klassendiagramm zeigt nur den Teil der
Attribute und Methoden, die für einen ersten Einstieg gebraucht werden.
Zu der Klasse gibt es eine Windows-Hilfe-Datei (WSocketHlp.zip), die die meisten Attribute
und Methoden erläutert.
In den Beispiel-Programmen wird TWSocket dynamisch verwendet, dh. es ist keine Installation der Komponenten erforderlich.
Download: client0.zip(ca. 47 kB)
procedure TClientForm.FormCreate(Sender: TObject); begin // Erzeugung socket := TWSocket.Create(nil); // Verbinden der Ereignis-Behandlungen socket.OnSessionConnected := socketSessionConnected; socket.OnSessionClosed := socketSessionClosed; socket.OnDataAvailable := socketDataAvailable; end; procedure TClientForm.FormDestroy(Sender: TObject); begin socket.Free; end; procedure TClientForm.bConnectClick(Sender: TObject); begin Socket.Addr := eAdresse.Text; Socket.Proto := 'tcp'; Socket.Port := ePort.Text; Socket.Connect; // versuche, Verbindung aufzubauen // nach dem effektiven Aufbau wird OnSessionConnected ausgelöst end; // Ereignis-Behandlung procedure TClientForm.SocketSessionConnected(Sender: TObject; Error: Word); begin FError := Error; // Fehlercode merken if Error <> 0 then mMeldungen.Lines.Add('keine Verbindung, Fehlernummer: ' + IntToStr(Error)) else mMeldungen.Lines.Add('Verbindung steht!'); bDisconnect.Enabled := true; bConnect.Enabled := false; end; // Ereignis-Behandlung procedure TClientForm.SocketDataAvailable(Sender: TObject; Error: Word); begin mEin.Lines.Add(Socket.ReceiveStr); end; // Ereignis-Behandlung procedure TClientForm.SocketSessionClosed(Sender: TObject; Error: Word); begin if FError = 0 then if Error <> 0 then mMeldungen.Lines.Add('Verbindung beendet, Fehlernummer: ' + IntToStr(Error)) else mMeldungen.Lines.Add('Verbindung beendet!'); bDisconnect.Enabled := false; bConnect.Enabled := true; end; procedure TClientForm.bSendenClick(Sender: TObject); begin Socket.Text := mAus.Text; end; procedure TClientForm.bDisconnectClick(Sender: TObject); begin Socket.Close; // beim effektiven Schluss wird OnSessionClosed ausgelöst end;