![]() |
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 |
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:
Der Server (Empfangen):
var MyStream:TMemoryStream;
begin mystream := TMemoryStream.Create; image1.picture.SaveToStream(myStream); ClientSocket.Socket.SendStream(myStream); . . . mystream.free;
Delphi-Quellcode:
Wenn du es trozdem mit UDP machen willst nimm die Indy Kompos. Der Code für den Server sollte der selbe sein.
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; |
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] |
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:
Und damit du bei deinem Programm nicht andauernt connecten musst, stellst du einmal die verbindung her und packst das versenden einfach in eine schleife:
Image1.Picture.Bitmap.LoadFromStream(FStream)
Zum Beispiel in diesem ![]() 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. |
Re: UDP » Dateien versenden
Zitat:
Ein ganz primitives Protokoll wäre:
Code:
Du schickst also immer wieder die Kennung IMG1, Länge der folgenden Daten und das eigentliche Bild.
4 Bytes Kennung 'IMG1'
4 Bytes Länge der Nutzdaten x Bytes Bilddaten Schickst du die Kennung QUIT trennt sich der Client vom Server. |
Re: UDP » Dateien versenden
Zitat:
und ich habe dieses hier benutzt um die Bilder zu versenden:
Delphi-Quellcode:
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...
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; hibbert |
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 ![]() |
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 |
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: ![]() |
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