Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi UDP » Dateien versenden (https://www.delphipraxis.net/52744-udp-%BB-dateien-versenden.html)

hibbert 2. Sep 2005 17:08


UDP » Dateien versenden
 
Hi,
eine eigentlich einfache Frage:
Wie versende ich Dateien, genauer gesagt ein Bild welches sich auf meinem Formblatt befindet per UDP an einen anderen Rechner ?

thx hibbert

igel457 2. Sep 2005 17:22

Re: UDP » Dateien versenden
 
Hallo erstmal,
warum möchtest du das mit UDP machen?
UDP kümmert sich nämlich nicht darum das die einzelnen Pakete auch da ankommen wo sie hin sollenm und eignet sich damit mehr für Spiele als für Daten (Dateien,Bilder...)
Da kann es dir dann passieren das die hälfte das Bildes, (oder noch schlimmer der Header) nicht ankommt.

Mit TCP geht das auch viel einfacher:

Der Client (Daten Senden):
Delphi-Quellcode:
var MyStream:TMemoryStream;
begin
  mystream := TMemoryStream.Create;
  image1.picture.SaveToStream(myStream);
  ClientSocket.Socket.SendStream(myStream);
.
.
.
  mystream.free;
Der Server (Empfangen):
Delphi-Quellcode:
procedure TServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  iLen,tlen: longint;
  Bfr: Pointer;
begin
  if curmemory = nil then curmemory := TMemoryStream.Create;
  curmemory.Seek(0, soFromEnd);
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    tlen := Socket.ReceiveBuf(Bfr^, iLen);
    curmemory.Write(Bfr^, tLen);
  finally
    FreeMem(Bfr);
  end;
end;
Wenn du es trozdem mit UDP machen willst nimm die Indy Kompos. Der Code für den Server sollte der selbe sein.

hibbert 2. Sep 2005 17:29

Re: UDP » Dateien versenden
 
Hi,
eine Frage zu den Quelltexten: Wie zeige ich das Bild auf dem anderen Rechner wieder an ?

hibbert

[PS]Ich habe das ja auch schon mit TCP gemacht und es funktioniert auch, doch was da stört ist, dass ich immer irgendwie vorher wieder disconnecten und neu connecten muss, damit ich ein weiteres Bild versicken kann. Ich möchte nämlich recht viele Bilder in der Sekunde verschicken, und bei UDP muss ich ja nicht mehr neu connecten wie ich das sehe...[/ps]

storm1988 2. Sep 2005 17:40

Re: UDP » Dateien versenden
 
So um jetzt mal alle deine Fragen von beiden Threads zu beantworten:

Um den Stream bei dem andren Computer wieder einzulesen muss du folgender maßen vorgehn
Delphi-Quellcode:
Image1.Picture.Bitmap.LoadFromStream(FStream)
Und damit du bei deinem Programm nicht andauernt connecten musst, stellst du einmal die verbindung her und packst das versenden einfach in eine schleife:

Zum Beispiel in diesem Beispiel von ManuMF müsstest du einfach die Procedure "procedure TSendeForm.DateiSendeButtonClick(Sender : TObject);" einfach immer in einer Schleife aufrufen wo bei du dass connect natürlich weglassen müsstest.

Und wenn du jetzt vom Server Datein an den Client senden willst, dann musst du die Sourcen einfach vertauschen. Wobei du aber den With Blocks bei behalten musst.

shmia 2. Sep 2005 17:44

Re: UDP » Dateien versenden
 
Zitat:

Zitat von hibbert
Ich habe das ja auch schon mit TCP gemacht und es funktioniert auch, doch was da stört ist, dass ich immer irgendwie vorher wieder disconnecten und neu connecten muss, damit ich ein weiteres Bild versicken kann. Ich möchte nämlich recht viele Bilder in der Sekunde verschicken, und bei UDP muss ich ja nicht mehr neu connecten wie ich das sehe...

Du musst ein Protokoll "fahren".
Ein ganz primitives Protokoll wäre:
Code:
4 Bytes Kennung 'IMG1'
4 Bytes Länge der Nutzdaten
x Bytes Bilddaten
Du schickst also immer wieder die Kennung IMG1, Länge der folgenden Daten und das eigentliche Bild.
Schickst du die Kennung QUIT trennt sich der Client vom Server.

hibbert 2. Sep 2005 18:06

Re: UDP » Dateien versenden
 
Zitat:

Zitat von storm1988
Zum Beispiel in diesem Beispiel von ManuMF müsstest du einfach die Procedure "procedure TSendeForm.DateiSendeButtonClick(Sender : TObject);" einfach immer in einer Schleife aufrufen wo bei du dass connect natürlich weglassen müsstest.

mhh das ist für Indy10 und ich habe die standart Indy Kompos die bei D7 mitinstalliert werden. Mir fehlt zb. die Datei IdStreamVCL.dcu


und ich habe dieses hier benutzt um die Bilder zu versenden:

Delphi-Quellcode:
procedure tform1.sendimage;
var
  fs: TFileStream;
begin
  with IdTCPClient1 do
  begin
    idtcpclient1.Host:=edit1.Text;

    fs := TFileStream.Create(fname+'.jpg', fmOpenRead or fmShareDenyWrite); //Datei in FileStream einlesen
idtcpclient1.Connect;
    try
      OpenWriteBuffer; //stellt sicher, dass alle Daten versendet werden
      try
        WriteStream(fs, true, true, 0); {das 2. true ist wichtig!, da es bewirkt, dass die Größe des Streams mittels WriteInteger zuerst verschickt wird}
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
    finally
    //  Disconnect;
      fs.Free;
    end;
  end;
end;
dabei habe ich auch das connect und disconnect weggelassen bzw. das connect vor der procedure ausgeführt. dann wurde das Bild einmal geschickt und danach nicht mehr...

hibbert

storm1988 2. Sep 2005 18:39

Re: UDP » Dateien versenden
 
Ich weis zwar nicht ob du es in deinem Programm auch so hast, aber in den Source den du gepostet hast, is das "idtcpclient1.Connect;" nicht auskommentiert.

Ansonsten müsste der Source code funzen. Du musst halt noch jeweils bevor du weitere Bilder sendest den Server mitteilen ob er weitere empfanden soll oder nicht.

Übrigens, wenn du mal mit diesem Source größere Datein verschicken willst dann musst du die Dateien vorher splitten. Ein Beispiel dazu findest du hier Link (Wird mit Indy 10 übrigens automatisch gemacht).

hibbert 2. Sep 2005 21:38

Re: UDP » Dateien versenden
 
hi,
also in meinem code oben habe ich das connect drin gelassen, weil ich den Source hier so im Forum (oder im DF) gefunden habe.

In meinem Prog habe ich das Dis/connect jeweils an die entspr. stellen gesetzt.

Wie sage ich denn dem Server, dass wenn er das Bild komplett empfangen hat, gleich noch eins anfordern soll bzw das der Client gleich noch eins nachschickt ?

die bilder die verschickt werden sind .jpg und unter 100 kb groß.

hibbert

Arnulf 3. Sep 2005 22:46

Re: UDP » Dateien versenden
 
ich glaub ich hab dazu eh schon mal eine komplette source gepostet.
grundsätzlich solltest du einfach die länge des bildes dem bild vorrausschicken, dann weißt du wieviel du vom socket lesen mußt.

Ich hab dazu 2 runmodes für das lesen von den sockets eingeführt.
Mit einem pseudo protokoll schickst du mal die info, daß jetzt ein bild kommt und dort dann gleich die größe des bildes mit.

also 'IMG324532' + #13#10
oder sowas in der Art.
wenn du also vom socket ließt, schaust du ob am Anfang IMG steht, dann schaust die größe nach und ließt so lange vom socket in eine datei oder zuerst in einen stream bis die größe erreicht ist, danach kannst wieder auf 'IMG' und eben der byte anzahl prüfen.

Arnulf

Edit:
Hab den thread gefunden:
http://www.delphipraxis.net/internal...719&highlight=


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