Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dateien mit Client/Serversocket versenden. KEIN INDY! (https://www.delphipraxis.net/29528-dateien-mit-client-serversocket-versenden-kein-indy.html)

T3rm1n4T0r 10. Sep 2004 12:31


Dateien mit Client/Serversocket versenden. KEIN INDY!
 
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 :)

Helmi 10. Sep 2004 13:00

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

NicoDE 10. Sep 2004 13:16

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

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?

T3rm1n4T0r 11. Sep 2004 11:38

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
 
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;

Luckie 11. Sep 2004 12:19

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

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?

T3rm1n4T0r 11. Sep 2004 12:50

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
 
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.

T3rm1n4T0r 12. Sep 2004 12:52

Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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