AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi UDP » Dateien versenden
Thema durchsuchen
Ansicht
Themen-Optionen

UDP » Dateien versenden

Offene Frage von "hibbert"
Ein Thema von hibbert · begonnen am 2. Sep 2005 · letzter Beitrag vom 3. Sep 2005
Antwort Antwort
Benutzerbild von hibbert
hibbert

Registriert seit: 26. Aug 2003
Ort: Berlin
262 Beiträge
 
Delphi 2005 Personal
 
#1

UDP » Dateien versenden

  Alt 2. Sep 2005, 17:08
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 17:22
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von hibbert
hibbert

Registriert seit: 26. Aug 2003
Ort: Berlin
262 Beiträge
 
Delphi 2005 Personal
 
#3

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 17:29
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]
  Mit Zitat antworten Zitat
Benutzerbild von storm1988
storm1988

Registriert seit: 4. Aug 2005
Ort: Salzburg
91 Beiträge
 
Delphi 6 Professional
 
#4

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 17:40
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
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 17:44
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von hibbert
hibbert

Registriert seit: 26. Aug 2003
Ort: Berlin
262 Beiträge
 
Delphi 2005 Personal
 
#6

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 18:06
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
  Mit Zitat antworten Zitat
Benutzerbild von storm1988
storm1988

Registriert seit: 4. Aug 2005
Ort: Salzburg
91 Beiträge
 
Delphi 6 Professional
 
#7

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 18:39
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).
  Mit Zitat antworten Zitat
Benutzerbild von hibbert
hibbert

Registriert seit: 26. Aug 2003
Ort: Berlin
262 Beiträge
 
Delphi 2005 Personal
 
#8

Re: UDP » Dateien versenden

  Alt 2. Sep 2005, 21:38
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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#9

Re: UDP » Dateien versenden

  Alt 3. Sep 2005, 22:46
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=
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:33 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