![]() |
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: ![]() 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:
Hoffe ihr könnt mir helfen!
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. ComboCraft |
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. |
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: |
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:
Du musst den Code anpassen und eventuell Fehler ausbessern.
//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; [....] MfG: sk0r |
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 |
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...)
|
Re: WinSock & Dateien versenden
Zitat:
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? |
Re: WinSock & Dateien versenden
So, neues Problem:
Delphi-Quellcode:
wird nicht erfüllt, also auch nichts gesendet!
while not eof(datei) do
was nun? |
Re: WinSock & Dateien versenden
Zitat:
Zitat:
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... |
Re: WinSock & Dateien versenden
Setz mal irgendwo vor der Schleife iResult auf irgendeinen Wert, ausser 0, und
benutz dann die Schleife
Delphi-Quellcode:
Denn iResult wird durch BlockRead mit den tatsächlich gelesenen Bytes gefüllt.
while iResult <> 0 do
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 00:13 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