Mega Code Archive

 
Categories / Delphi / LAN Web TCP
 

[] Serverdan clientte dosya gönderme işlemi

Merhaba Arkadaşlar.Bu projede Progressbar kullanılarak Server'dan Client'e sağlıklı bir şekilde nasıl dosya gönderileceğini yolluyorum.Dosya gönderme konusunda birçok örnek var ama sanırım en güzeli bu örnek.Hiçbir şekilde veri kaybına yol açmıyor.Kodu ben kendime göre dizayn ettim.Siz dilediğiniz gibi kullanabilirsiniz... // unreachableboy : unreachableboy@hotmail.com // Gerekli Unit'i veriyorum // PublicUnit Başlangıcı ********************* unit PublicUnit; interface uses Windows; type TClientStatus = (csCheck, csSend); TServerStatus = (ssFileNotFound, ssSending, ssReady); TFileName = array [0..Max_Path] of Char; implementation end. // PublicUnit Sonu ************************* Bu Uniti "PublicUnit.pas" olacak şekilde oluşturun.Client ve Server Projelerinizin olduğu dizinlere kopyalayın. // Server Kodu Başlangıcı *************************** private { Private declarations } procedure SendFile(S: string; Socket: TCustomWinSocket); public { Public declarations } end; var Form1: TForm1; implementation Uses PublicUnit; {$R *.dfm} procedure TForm1.SendFile(S: string; Socket: TCustomWinSocket); var FileStream: TFileStream; ServerStatus: TServerStatus; Boyut: Int64; Buffer: array [0..2047] of Char; Okunan, Gonderilen: integer; begin FileStream:=TFileStream.Create(S, fmOpenRead or fmShareDenyNone); try ServerStatus:=ssSending; Socket.SendBuf(ServerStatus, Sizeof(ServerStatus)); Boyut:=FileStream.Size; Socket.SendBuf(Boyut, Sizeof(Boyut)); FileStream.Position:=0; repeat Okunan:=FileStream.Read(Buffer, Sizeof(Buffer)); repeat Gonderilen:=Socket.SendBuf(Buffer, Okunan); until (Gonderilen <> -1) or not Socket.Connected; Application.ProcessMessages; until (FileStream.Position = FileStream.Size) or not Socket.Connected; finally FileStream.Free; end; end; procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var P: PChar; ClientStatus: TClientStatus; ServerStatus: TServerStatus; FileName: TFileName; begin if Socket.ReceiveLength < Sizeof(ClientStatus) then Exit; Socket.ReceiveBuf(ClientStatus, Sizeof(ClientStatus)); case ClientStatus of csCheck: begin while Socket.ReceiveLength < Sizeof(FileName) do; Socket.ReceiveBuf(FileName, Sizeof(FileName)); P:=@FileName[0]; if FileExists(P) then ServerStatus:=ssReady else begin ServerStatus:=ssFileNotFound; end; Socket.SendBuf(ServerStatus, Sizeof(ServerStatus)); end; csSend: begin while Socket.ReceiveLength < Sizeof(FileName) do; Socket.ReceiveBuf(FileName, Sizeof(FileName)); P:=@FileName[0]; SendFile(P, Socket); end; end; end; // Server Kodu Sonu ************************ // Client Kodu Başlangıcı **************************** private { Private declarations } procedure Gonder(var Buf; len: integer); public { Public declarations } end; var Form1: TForm1; Adres: string; ClientStatus: TClientStatus; ServerStatus: TServerStatus; FileName: TFileName; Dosya,dosyaadi: string; FileStream: TFileStream; Boyut: Int64; Okunuyor: Boolean; implementation Uses PublicUnit; {$R *.dfm} procedure TForm1.Gonder(var Buf; len: integer); begin if ClientSocket1.Active then ClientSocket1.Socket.SendBuf(Buf, len); end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin Dosya:=StrPas(@FileName[0]); Dosya := 'C:\kaynakdosya.exe'; // Bu dosya yüklenecek olan dosya Dosya:=Trim(Dosya); if Dosya = '' then begin Exit; end; ClientStatus:=csCheck; FillChar(FileName, Sizeof(FileName), 0); Move(Dosya[1], FileName[0], Length(Dosya)); Gonder(ClientStatus, Sizeof(ClientStatus)); Gonder(FileName, Sizeof(FileName)); end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin if Okunuyor then begin FileStream.Free; Okunuyor:=False; end; end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var Buffer: array [0..2047] of Char; Okunan, i: integer; S,ss: string; begin if Okunuyor then begin Okunan:=Socket.ReceiveBuf(Buffer, Sizeof(Buffer)); if Okunan > 0 then FileStream.WriteBuffer(Buffer, Okunan); i:=Round(FileStream.Position / Boyut * 100); if ProgressBar1.Position <> i then ProgressBar1.Position:=i; S:=InttoStr(i) + '% tamamlandı'; if FileStream.Size >= Boyut then begin Okunuyor:=False; FileStream.Free; ClientSocket1.Active:=False; end; Exit; end; while Socket.ReceiveLength < Sizeof(ServerStatus) do; Socket.ReceiveBuf(ServerStatus, Sizeof(ServerStatus)); case ServerStatus of ssFileNotFound: begin end; ssReady: begin ss:=ExtractFileName(Dosya); ClientStatus:=csSend; Gonder(ClientStatus, Sizeof(ClientStatus)); Gonder(FileName, Sizeof(FileName)); ss:='C:\hedefdosya.exe'; // Yüklenen dosyanın nereye kaydedileceği burada Dosya:=ss; if FileExists(Dosya) then DeleteFile(Dosya); end; ssSending: begin while Socket.ReceiveLength < Sizeof(Int64) do; Socket.ReceiveBuf(Boyut, Sizeof(Boyut)); FileStream:=TFileStream.Create(Dosya, fmCreate); FileStream.Position:=0; Okunuyor:=True; end; end; end; procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=true; end; procedure TForm1.Timer1Timer(Sender: TObject); begin ClientSocket1.Active:=true; end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval:=1; Timer1.Enabled:=False; end; // Client Kodu Sonu ****************************