![]() |
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:
So, nun seid ihr dran :)
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; |
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 |
Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
Zitat:
|
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; |
Re: Dateien mit Client/Serversocket versenden. KEIN INDY!
Zitat:
Hast du das ganze schon mal Schritt für Schritt debuggt? |
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. |
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