AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke IdTCPServer/IdTCPClient: Verbindung ablehnen?
Thema durchsuchen
Ansicht
Themen-Optionen

IdTCPServer/IdTCPClient: Verbindung ablehnen?

Ein Thema von romber · begonnen am 26. Apr 2013 · letzter Beitrag vom 27. Apr 2013
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?

  Alt 26. Apr 2013, 19:39
Der Objekt wir bei mir im OnConnect erzeugt, allerdings erst nach dem die Zugangsdaten geprüft und der Zugang genehmigt wurde.
Das würde ich ändern und das Objekt gleich erzeugen.
Ein Boolean Flag gibt an, ob der Client sich schon erfolgreich angemeldet hat.
Im OnConnect kann der Server z.B. eine Willkommensnachricht an den Client schicken aber es ist nicht der richtige Ort um schon durch die Anmeldung zu gehen.

Hier ein Beispiel für die Komunikation
Code:
Client öffnet die TCP-IP Connection
Server -> Client: "App-Server Version x.x"#13#10 (wird noch im OnConnect gesendet)
Client -> Server: "LOGIN username, passwort"#13#10
Server -> Client: "LOGIN OK"#13#10   oder "ACCESS DENIED"#13#10 (reaktion des Servers in OnExecute)
Server -> Client: "TEMP 25.5"#13#10  (das sind die Daten die der Server schickt, aber nur wenn der Benutzer angemeldet ist)
Server -> Client: "......."#13#10
Client -> Server: "LOGOFF"#13#10   (Client meldet sich ab)
Server schliest die TCP-IP Connection
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.167 Beiträge
 
Delphi 10 Seattle Professional
 
#2

AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?

  Alt 27. Apr 2013, 11:24
Client -> Server: "LOGIN username, passwort"#13#10
Und wenn der Client nichts sendet, nachdem er sich Verbunden hat? Wie breche ich die Verbindung ab, wenn der Client nichts sendet?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?

  Alt 27. Apr 2013, 11:48
Client -> Server: "LOGIN username, passwort"#13#10
Und wenn der Client nichts sendet, nachdem er sich Verbunden hat? Wie breche ich die Verbindung ab, wenn der Client nichts sendet?
Nach dem Verbindungsaufbau wird von Indy "sofort" die OnExecute Methode aufgerufen.

In dieser würde ich auch die erste Aktion des Servers unterbringen, das Warten auf die erste Nachricht (zum Beispiel Login).

Also in etwa (ungetestet):

Delphi-Quellcode:
procedure TMyIdTCPServer.OnExecute(AContext: TIdContext);
var
  Msg: string;
begin
  if not TMyContext(AContext).LoggedIn then
  begin
    // warte maximal 2000 Millisekunden
    Msg := AContext.Connection.IOHandler.ReadLn(2000);
    // Zeitüberschreitung?
    if AContext.Connection.IOHandler.ReadLnTimedOut then
    begin
      // lasse Indy die Connection beenden
      raise EIdException.Create('Received no login message');
    end else begin
      // prüfe, ob Login gültig und setze AContext.LoggedIn
      ...
    end;
  end
  else
  begin
    // bereits angemeldet, andere Aktionen ausführen
  end;
end;
AContext ist dabei eine anwendungsspezifische Unterklasse von TIdServerContext, in der die Property IsLoggedIn enthalten ist.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.167 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?

  Alt 27. Apr 2013, 17:15
Eins kapiere ich nocht nicht ganz.

Delphi-Quellcode:
procedure TMyIdTCPServer.OnExecute(AContext: TIdContext);
var
  Msg: string;
begin
  if not TMyContext(AContext).LoggedIn then
  begin
    // warte maximal 2000 Millisekunden
    Msg := AContext.Connection.IOHandler.ReadLn(2000);
    // Zeitüberschreitung?
    if AContext.Connection.IOHandler.ReadLnTimedOut then
    begin
      // lasse Indy die Connection beenden
      raise EIdException.Create('Received no login message');
    end else begin
      // prüfe, ob Login gültig und setze AContext.LoggedIn
      ...
    end;
  end
  else
  begin
    // bereits angemeldet, andere Aktionen ausführen
  end;
end;
Und zwar nehmen wir an, der Client ist LoggedIn und dann bricht die Verbindung plötzlich ab, warum auch immer. Dann ist der AContext, mit dem im o.g. Beispiel TMyContext identifiziert wird, nicht mehr gültig oder verstehe ich das falsch? Der Client stellt die Verbindung wieder her und bekommt einen neuen AContext zugewiesen. Wenn das so ist, wofür dann die if not TMyContext(AContext).LoggedIn ? Natürlich kann ich hinter LoggenIn-Property eine Funktion bauen, die überprüft, ob der Client bereits eingeloggt ist. Dafür benotige ich aber wiederum die Login-Daten des Clients, die erst in Msg := AContext.Connection.IOHandler.ReadLn(2000) abgefragt werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz