Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Senden/Empfangen mit TTcpServer? (https://www.delphipraxis.net/1365-senden-empfangen-mit-ttcpserver.html)

phsteckel 18. Nov 2002 18:55


Senden/Empfangen mit TTcpServer?
 
Hallochen,

ich arbeite gerade an einer Anwendung basierend auf TTcpServer bzw. TTcpClient. Ich bekomme es hin, dass der Client am Server anmeldet und verbindet.

Leider habe ich keine Ahnung, wie genau ich beim Server auf eingehende nachrichten reagiere - genauer: Über welches Ereignis kann ich auf eingehende Nachrichten reagieren (Listen, Accept, etc. sind ja nicht tauglich). Ich vermisse ein einfaches OnReceive oder ähnliches.

Muss ich hier mit Threads arbeiten?

Kennt sich hiermit jemand aus oder kann mir sogar ein kurzes Sample schicken?

etwas verwirrt,

phsteckel.

sakura 18. Nov 2002 19:08

Wenn Dir es reicht, dann kann ich Dir ein Beispiel senden, welches auf den Indy Komponenten (www.nevrona.com/Indy) für das TCP Protokoll basiert.

Das funktioniert recht gut - geht aber erst morgen, da das im Büro nur darauf wartet, weitergegeben zu werden.

RomanK 18. Nov 2002 21:44

Bei Delphi-Beispielen ist auch der Chat dabei ... der basiert auf den TClientSocket und TServerSocket. Vielleicht hilft dir dass weiter wenn du da mal reinschaust!

phsteckel 19. Nov 2002 08:35

Zitat:

Zitat von sakura
Wenn Dir es reicht, dann kann ich Dir ein Beispiel senden, welches auf den Indy Komponenten (www.nevrona.com/Indy) für das TCP Protokoll basiert.

Das funktioniert recht gut - geht aber erst morgen, da das im Büro nur darauf wartet, weitergegeben zu werden.

Das wäre super - Zur Not schreibe ich das auf Indy um - scheint ohnehin besser zu sein.

phsteckel

phsteckel 19. Nov 2002 08:38

Zitat:

Zitat von FuckRacism
Bei Delphi-Beispielen ist auch der Chat dabei ... der basiert auf den TClientSocket und TServerSocket. Vielleicht hilft dir dass weiter wenn du da mal reinschaust!

Leider wird hier keine wirkliche Verbindung etabliert. Der Client schliesst die Verbindung nach dem Senden eines Chat-Beitrages sofort wieder. Daher kann man das mit OnAccept komplett auslesen.

Was ich bräuchte wäre ein Beispiel/ eine Hilfestellung, mit der ich eine Verbindung aufbaue, bei der der Server nachdem die Verbindung besteht, auf eingehende Nachrichten reagiert. (Ich vermute mal, dass ich das mit Threads machen muss - da blicke ich allerdings noch nicht ganz durch;-)

phsteckel

sakura 19. Nov 2002 09:30

Liste der Anhänge anzeigen (Anzahl: 1)
:hi: phsteckel,

anbei das Demo Projekt. Es ist ein Client und ein Server - wie auch zu erwarten. Basierend auf den aktuellen INDY Komponenten habe ich im lokalen LAN einen Durchsatz von knapp 10 MB/sek erreicht, bei nur minimaler Auslastung der einzelnen Rechner.

Das ist kein fertig ausgearbeitetes Protokoll, sondern diente lediglich als Vorlage. Die einzelnen Schritte
  • Connection aufbauen
  • Client -> Server HELO name
  • Server -> Client +OK HELO (RandomID) - Die Random ID kann zum Verschlüsseln von Passwörtern genutzt werden
  • Client -> Server SIGN clientID
  • Server -> Client +OK
  • Client -> Server PASS passcode
  • Server -> Client +OK oder -ERR
  • Client -> Server PACK SourcePath;SourceFileName;FileSize
  • Client -> Server Daten der Datei
  • Server :: Speichern und Verbindungsabbruch

Threading ist heir nicht eingebaut, aber sehr leicht zu erreichen. Einfach für den Client eine separate Klasse erstellen. Bei Verbindungsaufbau eine Instanz der Klasse erstellen und diese dem Parameter AThread.Data zuweisen. Bei Verbindungsabruch diese Instanz wieder zerstören :!: Mit jedem Command kann mann dann über TKlassenName(ASender.Thread.Data) wieder auf den Clientthread zugreifen. Zusätzlich die TIdThreadMgrDefault in das Projekt aufnehmen und mit dem TCPServer verbinden.

Im Beispiel verweise ich auf die Unit uRoutines, welche Du nicht hast. In dieser ist lediglich die folgende Routine interessant.

Delphi-Quellcode:
function FetchA(
  var aSource: AnsiString; aDelimiter: AnsiChar = ';'; aDelete: Boolean = True
): AnsiString;
var
  I: Integer;
begin
  // find delimiter in element list
  I := Pos(aDelimiter, aSource);
  if I > 0 then
  begin
    // return next element
    Result := Copy(aSource, 1, I - 1);
    if aDelete then
      // remove returned element from list
      Delete(aSource, 1, I);
  end else begin
    // element is last in element list, return
    Result := aSource;
    if aDelete then
      // clear element list
      aSource := '';
  end;
end;

phsteckel 19. Nov 2002 12:36

Ich habe es jetzt tatsächlich endlich hinbekommen.

Die Vermutung, dass die Indy-Komponenten für meine Anwendung einfach zu mächtig (und zu unübersichtlich) sein könnten, war offenbar völlig falsch.

Im Gegenteil: Es hat jetzt sofort geklappt.

Vielen Dank an alle Tipp-Geber !!!

phsteckel

sakura 19. Nov 2002 12:42

Freut mich. Solltest Du Probleme mit dem Threading haben, mache einfach einen neuen Thread auf und lass es uns wissen. Alles schon gemacht.

Oben gepostetes Programm war ein Test für unsere Software, welcher von letzter Woche ist - und inzwischen komplett integriert ist. Falls Du noch ein Problem finden solltest, lass es mich wissen. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz