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