Witam
Przeczytałem wiele wątków, także artykułów, a mimo to kod nie działa jak powinien.
Ogólnie rzecz biorąc, mamy dwa programy serwer i klient, wymiana wiadomości działa.
Problem zaczyna się jeżeli jeden program chce przesłać plik do drugiego.
Schemat działania wygląda następująco,
- Klient wysyła wiadomość do serwera (komendę) na którą serwer odpowiada wysłaniem pliku
- Serwer wysyła plik w partiach po 1 kB, po wysłaniu każdej z partii oczekuję na wiadomość od klienta, że ten już odebrał daną partię.
Poniżej kod serwera
procedure TForm1.SendFile(const FileName: String);
var
Src : File;
BytesRead : Integer;
Buffer : array[0..1023] of char; // bufor przesyłanych danych
petla : Integer;
begin
petla := 0;
AssignFile(Src, FileName); //przypisanie pliku do Scr
Reset(Src, 1); // otwarcie pliku
while BytesRead > 0 do // pętla wykonywana dopóki zmienna BytesRead będzie większa od 0
begin
Inc(petla);
if (petla = 1) then
begin
BlockRead(Src, Buffer, SizeOf(Buffer), BytesRead); // odczytaj porcje danych 1024bity do zmiennej Buffer
ServerSocket1.Socket.Connections[0].SendBuf(Buffer, BytesRead);
end
else
begin
while (flaga = 0) do //zmienna globalna, gdy zero serwer oczekuje, gdy 1 znaczy ze klient odebral partie
begin
Application.ProcessMessages;
end;
if (flaga = 1) then
begin
BlockRead(Src, Buffer, SizeOf(Buffer), BytesRead); // odczytaj porcje danych 1024bity do zmiennej Buffer
try
ServerSocket1.Socket.Connections[0].SendBuf(Buffer, BytesRead);
flaga := 0;
except
end;
end;
end;
end;
Ponizej kod klienta
var
Buffer : array[0..1023] of char;
RealSize : Integer;
F : File;
begin
AssignFile(F, 'plik.bmp');
Rewrite(F, 1); // stworzenie nowego...
RealSize := Socket.ReceiveBuf(Buffer, SizeOf(Buffer));
BlockWrite(F, Buffer, RealSize); // zapisz tę porcję do oddzielnego pliku
ClientSocket1.Socket.SendText('ok');//wiadomosc do serwera ze odebrany plik
end;
Prosiłbym o wyjaśnienie, gdzie jest błąd w moim rozumowaniu.