[delphi][indy] wysylanie pliku z jednego kompa na drugi.

0

Siema. Szukalem w faq, gotwocach, na forum ale nie znalazlem nic co by mnie satysfakcjonowalo. chodzi o to ze robie screena i chce przeslac go na drugi komputer. uzywam komponentow IdTCPClient i IdTCPServer. Przedstawiam wam kod, ktory mi nie dziala, chcialbym zeby mnie ktos uswiadomil. :)

pobieranie


procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
  Size : integer;
  PicturePathName : string;
  ftmpStream : TFileStream;

begin

  PicturePathName := ExtractFileDir(ParamStr(0)) + '\Screen.JPG';

  if FileExists (PicturePathName) then 
    DeleteFile(PicturePathName);
  ftmpStream := TFileStream.Create(PicturePathName,fmCreate);
  Size := AThread.Connection.ReadInteger;
  AThread.Connection.ReadStream(fTmpStream,Size,False);
  FreeAndNil(fTmpStream);
end;

wysyalnie

procedure Tform1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
  Can: TCanvas;
  B: TBitmap;
  JPG: TJPEGImage;
  JPGstream: TMemoryStream;

begin
try
        Can := TCanvas.Create;
        Can.Handle := GetWindowDC(GetDesktopWindow);
        B := TBitmap.Create;
        B.Width := Screen.Width;
        B.Height := Screen.Height;
        B.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), Can, Rect(0, 0, Screen.Width, Screen.Height));
        JPG := TJPEGImage.Create;
        JPG.Assign(B);
        JPG.CompressionQuality := 10;
        JPG.Compress;
        JPG.SaveToStream(JPGstream);
        IdTCPClient1.WriteInteger(JPGstream.Size);
        IdTCPClient1.OpenWriteBuffer;
        IdTCPClient1.WriteStream(JPGstream);
        IdTCPClient1.CloseWriteBuffer;
        FreeAndNil(JPGstream);

      finally
        Can.Free;
        B.Free;
        JPG.Free;
      end;
end;
0

Jakoś dziwnie, żeś to napisał.

Po pierwsze pobieranie powinieneś mieć w IdTCPServerExecute. A wysyłanie powiedzmy w Timerze (wysyła screena co określoną ilość czasu). Kolejna sprawa to przydałoby się jakieś sprawdzanie czy do serwera idzie to co trzeba, czyli przed wysłaniem klient powinien coś wysłać, np.

IdTCPClient1.WriteInteger(666); 

a serwer powinien mieć w IdTCPServerExecute weryfikacje to co przyszło :

int command := AThread.Connection.ReadLn;
if command = 666 then
begin
//kod pobierania
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1