AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Dateien mit Client/Serversocket versenden. KEIN INDY!
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien mit Client/Serversocket versenden. KEIN INDY!

Ein Thema von T3rm1n4T0r · begonnen am 10. Sep 2004 · letzter Beitrag vom 12. Sep 2004
Antwort Antwort
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#1

Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 10. Sep 2004, 12:31
Hiho,
hab gesucht und viel gefunden, aber leider nichts dabei, da anscheinend hier jeder immer INDY benutzen will. ICH NICHT.
Hab es leider nicht hinbekommen mit Clientsocket eine Datei im LAN zu versenden.
Könnte mir da einer behilflich sein bitte?!

Probiert habe ich schon, die Datei in einen Stream zu laden und diesen dann mit SendStream zu verschicken ... aber hat natürlich nicht funktioniert.
Das Ganze sah in etwa so aus:
Delphi-Quellcode:
procedure TForm1.btnsendfilesClick(Sender: TObject);
var i, k, dateilaenge : Longint;
    dateiname : string;
    datei : TFileStream;
    ms : TMemoryStream;
begin
  for i := 0 to ListBox1.Items.Count-1 do
  begin
    datei := TFileStream.Create(ListBox1.Items[i], fmOpenRead);
    ms := TMemoryStream.Create;

    dateiname := ListBox1.Items[i];
    k := length(dateiname);
    while (dateiname[k] <> '\') do dec(k); //Dateiname rausfinden
    dateiname := copy(dateiname,k+1,length(dateiname)-k);
    dateilaenge := length(dateiname);

    ms.Write(dateilaenge,4);
    ms.write(pointer(dateiname)^, dateilaenge);
    ms.CopyFrom(datei,0);

    ms.Position := 0;
    try
      if server
      then begin
        ServerSocket1.Socket.Connections[0].SendStream(ms);
      end
      else begin
        ClientSocket1.Socket.SendStream(ms);
      end;
    finally
 // ms.Free;
   // datei.Free;
    end;
  end;
end;

//EMPFANGEN

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var EmpfTxt, dateiname : string;
    datei : TFileStream;
    ms : TMemoryStream;
    dateilaenge : integer;
begin
  EmpfTxt := Socket.ReceiveText;

  if (copy(EmpfTxt,1,4) = 'Text')
  then begin
    delete(EmpfTxt,1,4);
    EChatWindow.SelAttributes.Color := clblue;
    EChatWindow.Lines.Add(EmpfTxt);
    end ELSE begin

    ms := TMemoryStream.Create;
    ms.Setsize(Socket.ReceiveLength);
    ms.Write(EmpfTxt[1],length(EmpfTxt)-1);
    ms.Position := 0;
    ms.Read(dateilaenge,4); //Länge des Dateinamen lesen
    setlength(dateiname,dateilaenge);
    ms.read(pointer(dateiname)^, dateilaenge); //Jetzt den Dateinamen auslesen (man weiß wie lang er ist)
    datei := TFileStream.Create(ExtractFilePath(ParamStr(0))+dateiname, fmCreate); //datei erstellen
    datei.Position := 4 + dateilaenge;
    datei.CopyFrom(ms,ms.Size-dateilaenge-4);
    FreeAndNil(datei);
    FreeAndNil(ms);
  end;

end;
So, nun seid ihr dran
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 10. Sep 2004, 13:00
Hallo

schau dir mal die BeispielProgramme an.

Ich hatte mal das gleiche Problem wie du und hab mir die Beispielprogramme von einer anderen Delphihilfe schicken lassen.

Mir haben sie sehr geholfen - ich hoffe dir auch...

mfg
Helmi
Angehängte Dateien
Dateityp: zip clientserverfiletransport.zip (4,2 KB, 96x aufgerufen)
Dateityp: zip clientserverfiletransportprogressbar.zip (4,6 KB, 105x aufgerufen)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 10. Sep 2004, 13:16
Zitat von T3rm1n4T0r:
da anscheinend hier jeder immer INDY benutzen will. ICH NICHT.
Gibt es einen speziellen Grund, warum man alte Komponenten verwenden oder das Rad neu erfinden sollte?
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 11. Sep 2004, 11:38
So, danke für die Beispiele. Hab das mal probiert so zu machen. Geht aber leider nicht
Kann mir jemand sagen was ich falsch gemacht habe?
Hier der Code:
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var EmpfTxt : string;
    nReceived : Longint;
    datei : TFileStream;
begin
  EmpfTxt := Socket.ReceiveText;

  if (copy(EmpfTxt,1,4) = 'Text')
  then begin
    delete(EmpfTxt,1,4);
    EChatWindow.SelAttributes.Color := clblue;
    EChatWindow.Lines.Add(EmpfTxt);
    end ELSE if (copy(EmpfTxt,1,9) = 'Dateiname')
             then begin
               delete(EmpfTxt,1,9);
               Dateiname := EmpfTxt;
               end ELSE begin
                          case CliStatus of
                          csIdle: begin
                                    Socket.ReceiveBuf(Buffer, sizeof(Buffer));
                                    if (copy(Buffer,1,5) = 'Datei') then CliStatus := csFile;
                                    Buffer := '';
                                  end;
                          //ankommende Datei
                          csFile: begin
                                    if not Working then
                                    begin
                                      working := true;
                                      datei := TFileStream.Create(ExtractFilePath(ParamStr(0) + dateiname), fmCreate);
                                      try
                                        while True do
                                        begin
                                          nReceived := Socket.ReceiveBuf(Buffer, sizeof(Buffer));
                                          if nReceived <= 0 then Break
                                          else Datei.WriteBuffer(Buffer, nReceived);
                                          Sleep(200);
                                        end;
                                        Datei.position := 0;
                                      finally
                                        Datei.Free;
                                      end;
                                      cliStatus := csIdle;
                                      working := false;
                                    end;
                                  end;
                          end;
                        end;
end;

//Und zum Senden

procedure TForm1.btnsendfilesClick(Sender: TObject);
var i, k : Longint;

begin
  for i := 0 to ListBox1.Items.Count-1 do
  begin

    dateiname := ListBox1.Items[i];
    k := length(dateiname);
    while (dateiname[k] <> '\') do dec(k); //Dateiname rausfinden
    dateiname := copy(dateiname,k+1,length(dateiname)-k);
    try
      if server
      then begin
        ServerSocket1.Socket.Connections[0].SendText('Dateiname' + Dateiname); //dateiname senden
        ServerSocket1.Socket.Connections[0].SendText('Datei');
        ServerSocket1.Socket.Connections[0].SendStream(TFileStream.Create(Listbox1.Items[i], fmOpenRead or fmShareDenyWrite));
      end
      else begin
        ClientSocket1.Socket.SendText('Dateiname' + Dateiname);
        ClientSocket1.Socket.SendText('Datei'); //sagen dass jetzt ne Datei kommt
        ClientSocket1.Socket.SendStream(TFileStream.Create(Listbox1.Items[i], fmOpenRead or fmShareDenyWrite));
      end;
    finally
 // NICHTS
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 11. Sep 2004, 12:19
Zitat von T3rm1n4T0r:
Geht aber leider nicht
Was meinst du, wie viel wir mit so einer Fehlerbeschreibung anfangen können?

Hast du das ganze schon mal Schritt für Schritt debuggt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 11. Sep 2004, 12:50
Es kommt kein Fehler, aber die Datei kommt auch nicht auf der anderen Seite an. Das einzige was mir beim Debugge aufgefallen ist, dann wenn das erste Mal Read aufgerufen wird und ich den Dateinamen lesen will das der schon alle Daten enthält. Also den Dateinamen, danach DATEI (was ich ja auch sende) und dann auch schon den Inhalt der txt datei die ich senden wollte. Das kann ja irgendwie nicht richtig sein.
Mehr kann ich dazu nicht sagen.
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!

  Alt 12. Sep 2004, 12:52
Hab jetzt nochmal was verändert. Mein Problem jetzt ist, dass der Dateiname nicht NUR den Dateinamen enthält, sondern den ganzen Rest auch. Ich verstehe aber nicht warum. In dem Beispiel passiert das ja auch nicht?

Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var EmpfTxt : string;
    nReceived : Longint;
    datei : TFileStream;
begin
                          case CliStatus of
                          csIdle: begin
                                    Socket.ReceiveBuf(Buffer, sizeof(Buffer));
                                    if (copy(Buffer,1,5) = 'Datei') then CliStatus := csFile;
                                    if (copy(Buffer,1,4) = 'Text')
                                    then begin
                                      EmpfTxt := Buffer;
                                      delete(EmpfTxt,1,4);
                                      EChatWindow.SelAttributes.Color := clblue;
                                      EChatWindow.Lines.Add(EmpfTxt);
                                    end;
                                    if (copy(Buffer,1,5) = 'DName')
                                    then begin
                                      EmpfTxt := Buffer;
                                      delete(EmpfTxt,1,5);
                                      Dateiname := EmpfTxt;
                                    end;
                                    Buffer := '';
                                  end;
                          //ankommende Datei
                          csFile: begin
                                    if not Working then
                                    begin
                                      working := true;
                                      datei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'\'+dateiname, fmCreate);
                                      try
                                        while True do
                                        begin
                                          nReceived := Socket.ReceiveBuf(Buffer, sizeof(Buffer));
                                          if nReceived <= 0 then Break
                                          else Datei.WriteBuffer(Buffer, nReceived);
                                          Sleep(200);
                                        end;
                                        Datei.position := 0;
                                      finally
                                        Datei.Free;
                                      end;
                                      CliStatus := csIdle;
                                      working := false;
                                    end;
                                  end;
                          end;
end;

procedure TForm1.btnsendfilesClick(Sender: TObject);
var i, k : Longint;

begin
  for i := 0 to ListBox1.Items.Count-1 do
  begin

    dateiname := ListBox1.Items[i];
    k := length(dateiname);
    while (dateiname[k] <> '\') do dec(k); //Dateiname rausfinden
    dateiname := copy(dateiname,k+1,length(dateiname)-k);
    try
      if server
      then begin
        ServerSocket1.Socket.Connections[0].SendText('DName' + Dateiname); //dateiname senden
        ServerSocket1.Socket.Connections[0].SendText('Datei');
        ServerSocket1.Socket.Connections[0].SendStream(TFileStream.Create(Listbox1.Items[i], fmOpenRead or fmShareDenyWrite));
      end
      else begin
        ClientSocket1.Socket.SendText('DName' + Dateiname);
        ClientSocket1.Socket.SendText('Datei'); //sagen dass jetzt ne Datei kommt
        ClientSocket1.Socket.SendStream(TFileStream.Create(Listbox1.Items[i], fmOpenRead or fmShareDenyWrite));
      end;
    finally
 // NICHTS
    end;
  end;
end;
  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 13:52 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