![]() |
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. |
Wenn Dir es reicht, dann kann ich Dir ein Beispiel senden, welches auf den Indy Komponenten (
![]() Das funktioniert recht gut - geht aber erst morgen, da das im Büro nur darauf wartet, weitergegeben zu werden. |
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!
|
Zitat:
phsteckel |
Zitat:
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 |
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
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; |
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 |
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 23:10 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