Problem z przesyłaniem plików [DELPHI]
Mimitron - 24 Kwi 2004 19:35
Pisze mały program który będzie przesyłał screeny z komputera na którym będzie serwer.
Problem polega na tym ze plik można przesłać tylko raz .
Przy drugiej pubie ( narazie wykonywane jest to po naciśnięciu przycisku "WyslijPonownie" ) i zastąpieniu pliku "Screen.jpg" na jakiś inny (żeby była ta sama nazwa a rozmiar i zawartość inna) Client coś tam odbiera ale plik nie jest tworzony
Zauwarzyłem że wartość RecieveRec.FSize na Ciencie sie nie zmienia.
Natomiast serwer wartość Rec.FSize zmienia, więc albo jej już niewysyła albo Client jej nie odbiera.
Serwer :
var
Form1: TForm1;
Rec: TRecord;
RealSize : Integer; // realna odczytana wartosc z pliku
implementation
{$R *.dfm}
procedure tform1.send;
var
SrcFile : File;
begin
AssignFile(SrcFile, 'screen.jpg');
try
Reset(SrcFile, 1); // otworz plik, aby odczytac jego rozmiar...
Rec.FName := 'screen.jpg'; // do rekordu przypisz nazwe pliku
Rec.FSize := FileSize(SrcFile); // przypisz rozmiar pliku
Query(Rec); // wyslij zapytanie
lblProgress.Caption := 'Czekam na akceptacje...'; // info dla usera...
finally
CloseFile(SrcFile);
end;
end;
procedure TForm1.SendFile(const FileName: String);
var
SrcF : File;
Buffer : array[0..Count] of char; // bufor przesylanych danych
TotalSize : Integer;
begin
TotalSize := 0;
AssignFile(SrcF, FileName);
try
{ otwieramy plik zrodlowy i okreslamy jego rozmiar }
Reset(SrcF, 1);
lblProgress.Caption := 'Wysyłam plik...';
repeat
Application.ProcessMessages;
Sleep(10);
Seek(SrcF, TotalSize); // przesun na odpowiednia pozycje w pliku
{ tutaj nastepuje odczytanie 1 KB danych i przypisanie ich do bufora }
BlockRead(SrcF, Buffer, SizeOf(Buffer), RealSize);
if RealSize > 0 then // jezeli liczba odczytanych bajtow jest wieksza od zera...
begin
{ wyslij pakiet... }
Server.Socket.Connections[0].SendBuf(Buffer, RealSize);
TotalSize := TotalSize + RealSize;
end;
until RealSize = 0;
finally
CloseFile(SrcF);
end;
end;
procedure tform1.porownanie(odebrano:string);
begin
end;
procedure TForm1.WyslijPonownieClick(Sender: TObject);
begin
label1.Caption:='';
send;
end;
procedure TForm1.Query(var Rec: TRecord);
begin
{
ta procedura wysyla zapytanie - rekord, ktory zawiera rozmiar i nazwe pliku.
}
Server.Socket.Connections[0].SendBuf(Rec, SizeOF(Rec)) ;
label1.Caption:=currtostr(rec.FSize);
sleep(10);
SendFile('screen.jpg'); // wywolaj procedure
end;
procedure TForm1.ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
send;
end;
</delphi>
Client :
<delphi>
var F : File; // zmienna wskazuje na plik, ktory bedziemy odbierac
var TotalSize : Integer; // totalna liczba odczytanych bajtow...
procedure TForm1.RecieveFile(Sender: TObject; Socket: TCustomWinSocket);
var
Buffer : array[0..Count] of char;
RealSize : Integer;
jpg:TJPEGImage;
begin
{
procedura odczytuje przeslane dane i zapisuje do pliku
}
ProgressBar.Max := RecieveRec.FSize;
{ odczytaj odebrana porcej danych - RealSize oznacza ilosc rzeczywiscie odczytanych bajtow }
RealSize := Socket.ReceiveBuf(Buffer, SizeOf(Buffer));
{$I-}
BlockWrite(F, Buffer, RealSize); // bufor zapisz do pliku
{$i+}
TotalSize := TotalSize + RealSize; // okresl realna porcje odczytanych juz danych
ProgressBar.Position := TotalSize; // oznacz na komponencie
Socket.SendText(IntToStr(TotalSize));
{ jezeli ilosc odczytanych danych zgadza sie z rzeczywista iloscia - zamknij plik i zakoncz }
if RecieveRec.FSize = TotalSize then begin
CloseFile(F);
jpg:=TJPEGImage.Create;
jpg.LoadFromFile('Screen.jpg');
image1.Picture.Graphic:=jpg;
jpg.Free;
end;
{ wyswietl informacje dla uzytkownika }
lblProgress.Caption := 'Odbieram... ' + CurrToStr(TotalSize div 1024) + '/' + CurrToStr(RecieveRec.FSize div 1024) + ' kB';
end;
procedure TForm1.ReadRecord(Sender: TObject; Socket: TCustomWinSocket);
begin
{
to zdarzenie natomiast odczytuje przeslany rekord i prosi uzytkownika o
akceptacje na odebranie pliku
}
Socket.ReceiveBuf(RecieveRec, SizeOF(RecieveRec)); // odbierz naglowek...
{ wyswietl info dla usera }
AssignFile(F, 'Screen.jpg');
ReWrite(F, 1); // stworz plik do ktorego beda zapisywane dane
client.OnRead := RecieveFile;
end;
procedure TForm1.ConnectClick(Sender: TObject);
begin
client.Active:=true;
end;
procedure TForm1.DisconnectClick(Sender: TObject);
begin
client.Active:=false;
end;
Mam nadzieje że ktoś zrozumiał o co mi chodzi i będzie w stanie pomóc.
arnoldziq - 26 Sty 2010 20:35
Stary post.
Brak odpowiedzi.
Kosz.