Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy oder WinSock für Netzwerkanwendungen (https://www.delphipraxis.net/108607-indy-oder-winsock-fuer-netzwerkanwendungen.html)

Jackie1983 16. Feb 2008 13:35


Indy oder WinSock für Netzwerkanwendungen
 
hi,

möchte gern ein (noch) kleines Netzwerkprogramm programmieren. Es werden nur Werte und Texte versendet.

Womit würdet ihr ein Netzwerkprogramm programmieren. Mit den Indys oder mit WinSock.
Ich weis Indy baut auf WinSock auf.

Nur von Indy habe ich keine Ahnung und mit Winsock habe ich schon einige Anwendungen programmiert.

Habe schon mal mit Indy eine Anwendung programmiert aber irgend wie hat das nicht funktioniert. Der Server oder der Client ist immer eingefroren.

Wäre für einpaar Tipps dankbar!

rollstuhlfahrer 16. Feb 2008 13:56

Re: Indy oder WinSock für Netzwerkanwendungen
 
die WinSocket-komponenten haben nur eine begrenzte Anzahl von Zeichen, die gleichzeitig versendet werden können. (bei mir sind das 8192 Byte). Das Problem bei längeren Zeichenketten ist das zusammenfügen...
bei Indy hast du das Problem nicht, da es schon gemanaged wurde...

kleines Beispiel für Indy

Server
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TidPeerThread)
var befehl: string;
begin
befehl := Athread.Connection.ReadLn;
if Copy(befehl, 1, 3) = 'SCR' then
begin
  // zum Beispiel einen Screenshot mit einem Stream senden mittels
  AThread.Connection.WriteStream(Stream);
  // zum einfacheren abfragen auf der Clientseite:
  AThread.Connection.disconnect;
end;
if Copy(befehl, 1, 3) = 'TEX' then
  Athread.Connection.WriteLn('Text');
  // Bei einfachen Zeichenketten ist das nicht so umständlich
end;
end;
hier ist so ganz nebenbei noch zu empfehlen, den Execute-Block für ThreadSave in einen TCriticalSection-Block zu stecken (.Enter / .Leave)

Client
Delphi-Quellcode:
procedure Get;
begin
// TCPClient sollte schon verbunden sein
IdTCPClient1.WriteLn('SCREEN');
while IdTCPClient1.Connected do
IdTCPClient.ReadStream(Stream, -1, true) // Warten bis disconnect siehe oben
//...

IdTCPClient1.WriteLn('TEXT');
showmessage(IdTCPClient1.ReadLn);
end;
bei WinSockets gehts beim Server ähnlich. beim Client läuft das lesen über eine extra Prozedur, wesshalb der Programmablauf etwas unübersichtlich wird und alle Antworten in der selben Prozedur, die durchaus mal 800 mal hintereinander aufgerufen werden kann, behandelt werden.

rollstuhlfahrer

Jackie1983 16. Feb 2008 14:05

Re: Indy oder WinSock für Netzwerkanwendungen
 
danke, für das kleine Beispiel das hilft mir schon mal weiter.

Aber es könnte vorkommen das ich alle 10 oder 30 Sekunden ein befehl schicke.
Dann kann ich doch nicht immer die Verbindung aufbauen und wieder schließen oder?

rollstuhlfahrer 17. Feb 2008 10:50

Re: Indy oder WinSock für Netzwerkanwendungen
 
Zitat:

Zitat von Jackie1983
Dann kann ich doch nicht immer die Verbindung aufbauen und wieder schließen oder?

Nein, die Verbindung kann bestehen bleiben. Bei Streams musst du dir dann halt einen anderen weg ausdenken, bei Zeichenketten (strings) kann die Verbindung ruhig offen bleiben. Das Management ist hier wichtiger. Indy(TCP) ist es egal, was über die Leitung läuft, solange der restliche Programmablauf stimmt.

rollstuhlfahrer

Jackie1983 19. Feb 2008 20:32

Re: Indy oder WinSock für Netzwerkanwendungen
 
habe es mit indy programmiert, so das alles bestens funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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