Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi WinSock & Dateien versenden (https://www.delphipraxis.net/100991-winsock-dateien-versenden.html)

combocraft 6. Okt 2007 16:31


WinSock & Dateien versenden
 
Seid gegrüßt!

Ich hab zwar noch nie was gepostet, tobe hier aber schon lange im Forum rum und freu mich über die guten Beiträge!

Also, ich habe folgendes Problem, welches auf diesen Thread aufbaut: >Klick<

Das Problem ist halt das man zwar Dateien über SendStream verschicken kann, aber ich weiß nicht wie ich die vielen Zeichen mit dem Server wieder aufnehmen soll!
Memo versagt völlig und mit StringList komm ich auch nicht weiter!
Kann mir da jemand mal einen Tipp geben, ich würd eigentlich gerne mit StringList arbeiten!

Hier noch ein bissl Codesalat (ist nur ein experimenteller Code, daher nicht strukturiert etc):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var AStream:TFileStream;
begin
FreeAndNil(StringList);
AStream := TFileStream.Create('D:\Balls\balls\Cedfence.bmp', fmOpenRead or fmShareDenyWrite );
Clientsocket1.Socket.SendStream(AStream);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StringList.Add(Socket.ReceiveText);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringList:=TStringList.Create;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Edit1.Text:='CONNECTED';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
SaveDialog1.Execute;
StringList.SaveToFile(SaveDialog1.FileName);
end;

end.
Hoffe ihr könnt mir helfen!

ComboCraft

sk0r 6. Okt 2007 17:02

Re: WinSock & Dateien versenden
 
Du versendest einen Stream, d.h. binäre Daten. Du kannst sie nicht mit RecieveText als String speichern.
Schon mal eine Bild-Datei mit Notepad angesehen?^^

Du musst mit Socket.RecieveBuf() arbeiten.

Ich würde aber eine bestimmte Anzahl an Bytes senden, solange bis die Datei drüben ist.
Dazu eignet sich BlockRead und BlockWrite.

combocraft 6. Okt 2007 17:07

Re: WinSock & Dateien versenden
 
Doch das geht, habs ja schon gemacht (nur mit mäßigen erfolg, weil die Stringlist nicht soviel zeichen speichern konnte).

Im anderen Thread hat auch jemand geschrieben das er mit den Stringlisten 60mb verschickt hat!

Gespeichert wird das ganze später im Bildformat, und zack! ist das Bild wieder da!

Wenn mir mit den Stringlists niemand weiterhelfen kann, kann mir dann jemand sagen wie das mit den buffern geht? :oops:

PS: Klar hab ich schonmal ein Bild mit Notepad geöffnet ^^
Ich sag nur eins: Moderne Kunst!! :mrgreen:

sk0r 6. Okt 2007 17:46

Re: WinSock & Dateien versenden
 
Du öffnest eine beliebige Datei untypisiert und liest immer z.B. 2048 Bytes
und sendest diese an den Server bis du ans Ende der Datei angelangt bist.

Delphi-Quellcode:
//Server:
[....]
type TDLFile: array[0..2048-1] of Byte;
[....]
var datei: file;
    buffer: TDLFile;
    iResult: Integer;
begin
  AssignFile(datei, 'C:\bild.bmp');
  ReSet(datei, 1);
  while not eof(datei) do
  begin
    BlockRead(datei, buffer, 2048, iResult);
    Socket.SendBuf(buffer, iResult);
  end;
  CloseFile(datei);
end;
[....]

//Client:
[...]
type TDLFile: array[0..2048-1] of Byte;
var dlCounter: Cardinal = 0;
[....]
procedure WriteToNewFile(bByteDat: TDLFile; iSize: Integer);
var
  hDat: File;
begin
  if FileExists('C:\new_bild.bmp') then
  begin
    AssignFile(hDat, 'C:\new_bild.bmp');
    ReSet(hDat, 1);
    Seek(hDat, soFromBeginning+dlCounter);
    BlockWrite(hDat, bByteDat, iSize);
    inc(dlCounter, iSize);
    CloseFile(hDat);
  end
  else begin
    AssignFile(hDat, 'C:\new_bild.bmp');
    ReWrite(hDat, 1);
    BlockWrite(hDat, bByteDat, iSize);
    dlCounter := iSize;
    CloseFile(hDat);
  end;
end;
[....]
var
  buffer: TDLFile;
  iResult: Integer;
begin
  Socket.RecieveBuf(buffer, Socket.RecieveLength);
  WriteToNewFile(buffer, Socket.RecieveLength);
end;
[....]
Du musst den Code anpassen und eventuell Fehler ausbessern.

MfG: sk0r

combocraft 6. Okt 2007 17:56

Re: WinSock & Dateien versenden
 
Danke!! :shock:

Sehr cool, werd ich gleich ausprobieren!

Edit: Hmm.. wo muss denn bitteschön "TDLFile: array[0..2048-1] of Byte;" hin?

Wenn ich das zu Type packe, dann macht der murks!

'=' expected but ':' found

Muetze1 6. Okt 2007 18:23

Re: WinSock & Dateien versenden
 
Der Compiler sagt es doch schon: er will kein : sondern ein = bei der Typdeklaration (genauo bei dem : stellt sich sogar der Cursor, wenn du einen Doppelklick auf die Fehlermeldung machst...)

combocraft 6. Okt 2007 18:47

Re: WinSock & Dateien versenden
 
Zitat:

Zitat von Muetze1
Der Compiler sagt es doch schon: er will kein : sondern ein = bei der Typdeklaration (genauo bei dem : stellt sich sogar der Cursor, wenn du einen Doppelklick auf die Fehlermeldung machst...)

Vielen Dank, aber der Rat kommt viel zu spät ^^
Hatte vergessen den Post wieder zu löschen, hatte in dem moment ein Brett vorm Kopf!

Muetze1... der Name kommt mir bekannt vor, hast du dich nicht in einem anderen Thread mit jemand anderen gestritten?

combocraft 6. Okt 2007 19:05

Re: WinSock & Dateien versenden
 
So, neues Problem:
Delphi-Quellcode:
  while not eof(datei) do
wird nicht erfüllt, also auch nichts gesendet!

was nun?

Muetze1 6. Okt 2007 19:09

Re: WinSock & Dateien versenden
 
Zitat:

Zitat von combocraft
Muetze1... der Name kommt mir bekannt vor, hast du dich nicht in einem anderen Thread mit jemand anderen gestritten?

Kann schon sein, davon kann ich mich nicht freisprechen.

Zitat:

Zitat von combocraft
So, neues Problem:
Delphi-Quellcode:
  while not eof(datei) do
wird nicht erfüllt, also auch nichts gesendet!

1. Entweder ist er beim Öffnen der Datei sofort am Ende (Sprich: Datei hat eine Grösse von 0 bytes)
2. Er könnte die Datei nicht öffnen
3. Er hat eine neue Datei angelegt und ist von daher direkt am Ende.

Und noch was allgemeines: Bitte editiere deine Beiträge anstatt an einen Beitrag von dir sofort einen neuen anzuhängen...

Rastaman 6. Okt 2007 19:10

Re: WinSock & Dateien versenden
 
Setz mal irgendwo vor der Schleife iResult auf irgendeinen Wert, ausser 0, und
benutz dann die Schleife

Delphi-Quellcode:
while iResult <> 0 do
Denn iResult wird durch BlockRead mit den tatsächlich gelesenen Bytes gefüllt.
Ist es 0, so bist du am Ende der Datei.

Wenns nicht geht siehe Mützes 3 Möglichkeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 Uhr.
Seite 1 von 2  1 2      

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