AGB  ·  Datenschutz  ·  Impressum  







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

WinSock & Dateien versenden

Ein Thema von combocraft · begonnen am 6. Okt 2007 · letzter Beitrag vom 6. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
combocraft

Registriert seit: 3. Okt 2007
7 Beiträge
 
#1

WinSock & Dateien versenden

  Alt 6. Okt 2007, 17:31
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
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 18:02
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.
  Mit Zitat antworten Zitat
combocraft

Registriert seit: 3. Okt 2007
7 Beiträge
 
#3

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 18:07
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?

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

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 18:46
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
  Mit Zitat antworten Zitat
combocraft

Registriert seit: 3. Okt 2007
7 Beiträge
 
#5

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 18:56
Danke!!

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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 19:23
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...)
  Mit Zitat antworten Zitat
combocraft

Registriert seit: 3. Okt 2007
7 Beiträge
 
#7

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 19:47
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?
  Mit Zitat antworten Zitat
combocraft

Registriert seit: 3. Okt 2007
7 Beiträge
 
#8

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 20:05
So, neues Problem:
  while not eof(datei) do wird nicht erfüllt, also auch nichts gesendet!

was nun?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 20:09
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 von combocraft:
So, neues Problem:
  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...
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#10

Re: WinSock & Dateien versenden

  Alt 6. Okt 2007, 20:10
Setz mal irgendwo vor der Schleife iResult auf irgendeinen Wert, ausser 0, und
benutz dann die Schleife

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.
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:34 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