Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Bist Du dir sicher, das die Verbindung immer aufgerecht gehalten wird oder das der Server die Verbindung trennt und Du versuchst noch Daten zu lesen oder zusenden?
die Verbindung wird jedesmal wieder neu aufgebaut und getrennt... und, das der Client was lesen will, was garnich da is glaub ich eigentlich auch weniger.. denn dann kommt doch dieses "Connection Closed Gracefully", oder?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Aya hat geschrieben:
die Verbindung wird jedesmal wieder neu aufgebaut und getrennt... und, das der Client was lesen will, was garnich da is glaub ich eigentlich auch weniger.. denn dann kommt doch dieses "Connection Closed Gracefully", oder?
Das andauernde Öffnen und Schliessen einer Verbindung für jedes Datensenden halte ich für eine sehr sehr schlechte Idee, und das werden dir auch andere Personen bestätigen...deshalb würde ich dir empfehlen die Verbindung nur einmal aufzubauen, und dann erst beim Schliessen des Servers (Sprich Programmende) wieder zu trennen.Damit vermeidest du viele Probleme, und unter Umständen kann es auch mal sein das dass Öffnen einer Verbindung etwas länger dauerd, und dann gibts ja beim Senden der Daten Probleme.
Du wirst übrigens kaum ein Programm/Spiel finden, das Netzwerkverbindungen so handhabt wie du, und das wird wohl auch seinen Grund haben.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Aya hat geschrieben:
Aya hat geschrieben:
Wenn du mir dann noch sagst, wie ich mein Indy TCP/IP Clienten mitbekomme ob der server was schickt, lasse ich die Verbindung auch permanent offen....
Sagst du's mir nich, oder weißt du's nich??? :unsure:
Sry, aber ich muss dich enttäuschen : Ich weiss es ehrlich gesagt nicht!
Ich arbeite nämlich leider nicht mit den Indykomponenten, sondern nutze die Delphiklassen TServerSocket und TClientSocket...ich war deshalb der Meinung das hier jemand der Indy in der Praxis einsetzt dir darauf antworten kann.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das war auch der Grund, warum ich für die Netzwerkunterstützung in NapalmBomber3D die oben genannten Delphiklassen genutzt hab.Beim Indy TCPClient hab ich nämlich, genauso wie du, auf die Schnelle keine Möglichkeit gefunden, herauszufinden wenn der Server Daten an den Client schickt.
Der TClientSocket hat allerdings ein praktisches Ereignis (OnRead), mit dessen Hilfe sich das sehr sehr einfach realisieren lässt...wenn man nix all zu Komplexes will, dann sollten diese Klassen deshalb auch ausreichen, zumal man hier auch Threads nutzen kann.
P.S. : Gibts hier nicht noch andere Personen die die Indy-Komponenten nutzen und weiterhelfen könnten :unsure:
Der TClientSocket hat allerdings ein praktisches Ereignis (OnRead), mit dessen Hilfe sich das sehr sehr einfach realisieren lässt...wenn man nix all zu Komplexes will, dann sollten diese Klassen deshalb auch ausreichen, zumal man hier auch Threads nutzen kann.
Die hatte ich anfangs für dieses Projekt hier auch verwendet, nur bei den Datenmengen die ich hier dauernd hin und herschiebe waren die nicht ausreichend...
Es war da z.B. immermal so das dinge verloren gingen etc...
Au'revoir, Aya~
PS: Das dollste is ja, ich hab alles mit ReadLn und ReadInteger etc aufgebaut... das war der größte fehler den ich machen konnte.. ich bin jetzt, wo das Projekt ca~ 120.000 Zeilen hat daran alles in Streams zu packen, denn beim ReadLn gab es laufend fehler... -_-
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
In einem Datenbankreplikationsservice setze ich die Indy - Komponenten bisher ohne Probleme ein. Dieser Service hält ständig die Verbindung offen, wenn ein Client sich am Service anmeldet. Der Client beendet immer die Verbindung, niemals der Server, außer der Service wird beendet, z. B. durch einen Shutdown. Der Service wartet auf einen Befehl und sendet Antworten an den Client.
Dabei gehe ich wie folgt vor:
Zitat:
function WaitForNextAnswer(var Cmd : String) : Boolean; var Data : String; begin Result := False; Data := Server.ReadLn(EOL, MaxTimeout); if (Data <> '') then begin Cmd := Data; Result := True; end; end;
procedure Execute; var Cmd : String; begin Send('Hallo'); while (not Stopped) do begin if not WaitForNextAnswer(Cmd) then begin Continue; end; // Cmd weiter bearbeiten end;
if Client.Connected then begin Server.Disconnect; end; end;
Diese Lösung kommt in mehreren Firmen zum Einsatz und läuft seit ca. 2 Jahren zufrienden stellend. Der Client arbeitet dabei nicht Thread orientiert, der Server erstellt für jeden Client einen eigenen Thread.
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.