![]()  | 
			|||
| 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;