AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy 10 TCP Client Server -> MemoryStreams übertragen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 TCP Client Server -> MemoryStreams übertragen

Ein Thema von stahli · begonnen am 9. Okt 2012 · letzter Beitrag vom 25. Okt 2012
Antwort Antwort
Seite 2 von 2     12   
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 23. Okt 2012, 16:25
für svn > tortoise installieren und dann der Anleitung im Projekt befolgen.... bin mittlerweile ein großer Fan von svn + Tortoise

Thread Safe : welche Punkte im Code sind Dir aufgefallen ?
VCL Ausgaben im Indyserver.execute muss ich noch entfernen
mein ziel ist schon Thread Safe samples zu erstellen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 00:24
So, ich bin doch wieder bei Indy. Das erscheint mir komfortabler und das Problem mit der GUI-Syncronisation besteht bei der flachen Variante ja auch.

Die Übertragung mit dem Ende-Kennzeichen ist gelöst.
Die Lösung habe ich hier gefunden: http://stackoverflow.com/questions/1...nd-line-breaks
-> IdTCPClient.IOHandler.Write Ln (S + #0);
Man darf beim Schreiben nicht WriteLn verwenden, da sonst ein #13#10 angehängt wird. Beim Lesen wird dann bis zum Endekennzeichen gelesen und der Zeilenumbruch verbleibt im Puffer. Dadurch hakt im weiteren Verlauf die Kommunikation.
In gewisser Weise macht das Sinn.

Die Übertragung per Stream funktioniert grundsätzlich auch - ABER!
Die Größe des eingehenden Streams kann ich noch nicht ermitteln. Im Test kürze ich den Steam jetzt auf 14 Byte und lese 14 Byte aus. So ist erkennbar, dass die Übertragung perfekt funktioniert.
Jetzt müsste ich noch eine Möglichkeit finden, InputStream.Size vor dem Lesen des Streams zu ermitteln. Dann wären alle Übertragungsvarianten fertig.


Die syncronisierte Ausgabe in die Memos werde ich dann in einem Tread versuchen, der dazu auf die Syncronisation mit dem MainThread wartet.
Angehängte Dateien
Dateityp: zip Indy10TCPStreamTest.zip (704,8 KB, 20x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#13

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 08:18
Du schickst einfach vorneweg die Länge des Streams z.B. in einem DWord/Cardinal und liest das als erstes aus.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 08:29
Das problem mit de Länge des Streams sollte eigentlich in meinem samples gelöst sein

(einfach mal das Video Play Badminton) als *.swf Datei ansehen


Zum Thema VCL syncro folgender Link http://stackoverflow.com/questions/9...ng-application

In meiner eigene app habe ich ein TTHread.syncronize(nil, meineGUIupdate); eingebaut
Dieses Thema ist heute noch nicht in den samples eingebaut

Geändert von bernhard_LA (24. Okt 2012 um 09:48 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 18:26
in den source forge INDY 10 TCP Client Server Demos ist die ganz GUI interaction immer mit IDNotify( GUIprocedure) ; abgeschottet. vermutlich reicht es aus nur


Delphi-Quellcode:
TCPserver.Onexecute(----);
     

     .....
    GUIProcedure;
    TTHreadSyncronize(nil, GUIProcedure);
    ....

end;
als Strickmuster zu befolgen.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 22:56
Hallo Bernhard,

vielen Dank schon mal für Deine Demos!
Ich habe mir mal 4 Funktionen ausgeliehen

Die 4 Varianten der Datenübertragung funktionieren jetzt einwandfrei.

Die GUI-Syncronisation habe ich jedoch noch nicht hin bekommen.
Eine IdAntiFreeze verhindert zwar ein Einfrieren, verzögert aber den gesamten Ablauf EXTREMST.

Deinen Hinweis kann ich leider nicht genau einordnen. Kannst Du das konkretisieren?

Ich hätte von mir aus einen Thread gestartet, dem ich im Execute einen "Modus" und einen "String" übergebe.
Im Syncronisize würde ich den String dann je nach Modus an eine der 4 Log-Funktionen geben.
Ist das zu kompliziert?
Angehängte Dateien
Dateityp: zip Indy10TCPStreamTest.zip (713,2 KB, 28x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 24. Okt 2012, 23:28
ich habe mich bei meiner Lösung an diesem Thema orientiert http://stackoverflow.com/questions/1...-safe-vcl-code;

Der Trick war bei mir TTHtread.syncronize ( Nil -> hält den server execute Thread an, Meine GUI Funktion -> bitte zuerst hier alle Ausgaben); ich habe meine Demos noch nicht mit dieser Technik getested, ich verwende dieser Schema bei meiner Produktiven Anwendung.

Kennst du diesen link http://stackoverflow.com/questions/9...ng-application

Geändert von bernhard_LA (24. Okt 2012 um 23:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Indy 10 TCP Client Server -> MemoryStreams übertragen

  Alt 25. Okt 2012, 22:07
SEHR SCHÖN!

Also jetzt funktioniert (fast) alles wunderbar und ist m.E. ein sehr schönes Demoprojekt, um Indy-Streams nachzuvollziehen.

Zwei kleine Schönheitsmankos:
-> InfoClientIn wird an 4. Stelle aufgerufen, aber schon an zweiter dargestellt. (Das ist aber ja in einer realen Client/Server-Anwendung kein Problem.)
-> Die MemoServerOut.Scrollbar wird nicht an´s Ende gesetzt.

Die VCL-Syncronisation für Client-Infos ist nicht erforderlich, kann aber dennoch durchgeführt werden.
Syncronisation ist immer beim Server notwendig wenn man VCL-Ausgaben durchführt.

Jetzt kann ich mal schauen, ob ich das so auf mein eigentliches Projekt umsetzen kann...
Miniaturansicht angehängter Grafiken
indy10tcpstream.png  
Angehängte Dateien
Dateityp: zip Indy10TCPStreamTest.zip (736,4 KB, 91x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00:13 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