IdTCPServer, idTCPCliente

04/01/2006

Estou usando esses dois componentes , e estou tentando enviar uma imagem um PrintScreen, funciona assim

O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage

O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia.

O que pode ser??


Rudá

Respostas

26/03/2006

Paullsoftware

Estou usando esses dois componentes , e estou tentando enviar uma imagem um PrintScreen, funciona assim O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia. O que pode ser??


Eu to precisando fazer isso que vc já fez, me mostra o teu código ai :idea: :wink:


Responder Citar

26/03/2006

Rudá

Você envia por stream só que tem que disconectar para enviar!


Responder Citar

26/03/2006

Paullsoftware

não entendi, como assim... tenho que desconectar do servidor para poder enviar a tela...
enviar a tela do servidor para o cliente eu fiz numa boa
não consigo é, enviar do cliente para o servidor. da erro.
pode postar teu código ae! :lol:


Responder Citar

26/03/2006

Kroki

O componente indy tem esse exemplo mas é lento demais.
Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.


Responder Citar

27/03/2006

Paullsoftware

O componente indy tem esse exemplo mas é lento demais. Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.

certo, copiar eu sei, mais salvar como jpg não! :wink:


Responder Citar

27/03/2006

Paulocesar1301

Capturando Tela:

function CapturaTela: TBitmap;
var
  dc:hdc;
  cv:TCanvas;
begin
  result := TBitmap.Create;
  result.Width := Screen.Width;
  result.Height := Screen.Height;
  dc := GetDc(0);
  cv := TCanvas.Create;
  cv.Handle := DC;
  result.Canvas.CopyRect(Rect(0, 0,Screen.Width,Screen.Height), cv,Rect(0,0,Screen.Width, Screen.Height));
  cv.Free;
  ReleaseDC (0, DC);
end;


No Execute do Server:

    s := AThread.Connection.ReadLn;
    sCommand := uppercase(copy(s,1,3));

    if sCommand = ´SRN´ then
    begin
      tBM := TBitmap.Create;
      tBM := CapturaTela;

      jpg := TJPEGImage.Create;
      Try jpg.PixelFormat := jf8Bit; Except End;
      Try jpg.CompressionQuality := 30; Except End;
      Try jpg.Compress; Except End;

      jpg.Assign(tBM);
      DeleteFile(Tmp + ´Tela.jpg´);
      jpg.SaveToFile(Tmp + ´Tela.jpg´);

      jpg.Free;
      tBM.Free;

      Stm := TFileStream.Create(Tmp + ´Tela.jpg´, fmOpenRead + fmShareDenyNone);
      AThread.Connection.OpenWriteBuffer;
      AThread.Connection.WriteStream(Stm);
      AThread.Connection.CloseWriteBuffer;
      FreeAndNil(Stm);
      AThread.Connection.Disconnect;
    End


Com isso aki você consegue um arquivo muito pequeno com uma qualidade boa... ótimo para transferência via rede:

  Try jpg.PixelFormat := jf8Bit; Except End;
  Try jpg.CompressionQuality := 30; Except End;
  Try jpg.Compress; Except End;


Aki trabalho com telas quase que em :!: ´tempo real´ :!: , pois uso um timer com temporização de apenas 1000 e roda beleza


Responder Citar

27/03/2006

Paullsoftware

Capturando Tela:
function CapturaTela: TBitmap;
var
  dc:hdc;
  cv:TCanvas;
begin
  result := TBitmap.Create;
  result.Width := Screen.Width;
  result.Height := Screen.Height;
  dc := GetDc(0);
  cv := TCanvas.Create;
  cv.Handle := DC;
  result.Canvas.CopyRect(Rect(0, 0,Screen.Width,Screen.Height), cv,Rect(0,0,Screen.Width, Screen.Height));
  cv.Free;
  ReleaseDC (0, DC);
end;
No Execute do Server:
    s := AThread.Connection.ReadLn;
    sCommand := uppercase(copy(s,1,3));

    if sCommand = ´SRN´ then
    begin
      tBM := TBitmap.Create;
      tBM := CapturaTela;

      jpg := TJPEGImage.Create;
      Try jpg.PixelFormat := jf8Bit; Except End;
      Try jpg.CompressionQuality := 30; Except End;
      Try jpg.Compress; Except End;

      jpg.Assign(tBM);
      DeleteFile(Tmp + ´Tela.jpg´);
      jpg.SaveToFile(Tmp + ´Tela.jpg´);

      jpg.Free;
      tBM.Free;

      Stm := TFileStream.Create(Tmp + ´Tela.jpg´, fmOpenRead + fmShareDenyNone);
      AThread.Connection.OpenWriteBuffer;
      AThread.Connection.WriteStream(Stm);
      AThread.Connection.CloseWriteBuffer;
      FreeAndNil(Stm);
      AThread.Connection.Disconnect;
    End
Com isso aki você consegue um arquivo muito pequeno com uma qualidade boa... ótimo para transferência via rede:
  Try jpg.PixelFormat := jf8Bit; Except End;
  Try jpg.CompressionQuality := 30; Except End;
  Try jpg.Compress; Except End;
Aki trabalho com telas quase que em :!: ´tempo real´ :!: , pois uso um timer com temporização de apenas 1000 e roda beleza

a função para criar a tela eu já tenho CapturaTela, mais não ta compilando o código do onServerExecute não tá compilando...
nessa linha
jpg := TJPEGImage.Create;

dúvida...
AThread.Connection.Disconnect; 
tenho que desconectar a estação?


Responder Citar

27/03/2006

Paulocesar1301

Coloque Jpeg na Uses :wink:


Responder Citar

27/03/2006

Paullsoftware

Coloque Jpeg na Uses :wink:

desculpa a demora na resposta, eu já tinha conseguido, mais tira outra dúvida minha...
esse código é pra pegar a imagem do server ou do cliente?


Responder Citar

28/03/2006

Paullsoftware

Cara consegui fazer... valeu mesmo pela dica!
agora vamos lá... temo como fazer uma espécie de painel onde eu possa monitrar todos os terminais de uma única vez???

tipo coloco 4 tImage e cada um deles eu mostrar a tela de um terminal, claro, seria carregado cada um de uma vez, mais gostaria de fazer isso a cada 30 segundos... :roll:


Responder Citar

28/03/2006

Rudá

É só colocar um timer com o interval de 30000 (30 segundos);


Responder Citar

28/03/2006

Paulocesar1301

Bom... acredito que seu Client (maq que solicitará as imagens) precisará ser um equipamento razoavelmente bom para isso funcionar sem problemas, mas em tese, a idéia é a mesma, basta solicitar a screen 4 vezes aos 4 IPs diferentes:

Agora, sinceramente não testei e desculpem amigos do forum se falei besteira... mas se colocares 4 IdTCPClients em seu form... podes fazer assim:

MeuForm.IdTCPClient01.Host := IPUsu;
MeuForm.IdTCPClient01.Connect;
MeuForm.IdTCPClient01.WriteLn(´SRN´);

Stm := TFileStream.Create(Tmp + ´telaest01.jpg´,fmCreate);

try while MeuForm.IdTCPClient01.Connected do
       MeuForm.IdTCPClient01.ReadStream(Stm,-1,true);
except end;

FreeAndNil(Stm);

If FileExists(Tmp + ´telaest01.jpg´) Then
begin
  MeuForm.ImagemTela01.Picture := nil;
  MeuForm.ImagemTela01.Picture.LoadFromFile(Tmp + ´telaest01.jpg´);
  Application.ProcessMessages;
  MeuForm.Refresh;
end
Else begin
  MeuForm.ImagemTela01.Picture := nil;
end;

MeuForm.IdTCPClient01.Disconnect;


... onde tiver 01 basta alterar para a estação que quiser carregar ... ou trabalhas com [b:7aed5dc757]For[/b:7aed5dc757] ou duplicas o códigos estaticamente 4 vezes... vai depender do quanto seu sistema deverá ser dinâmico... no meu caso, acabei de saber que precisarei fazer tipo uma recepção (câmeras de segurança) então na minha tela o bendito do usuário terá a opção de selecionar quantas e quais as telas que ele quer ver ao mesmo tempo na tela... ainda estou pensando no código, mas já sei de antemão que terei que criar tudo em tempo de execução !!! Vai dar um trabalho !!! :cry:


Responder Citar

29/03/2006

Paullsoftware

Bom... acredito que seu Client (maq que solicitará as imagens) precisará ser um equipamento razoavelmente bom para isso funcionar sem problemas, mas em tese, a idéia é a mesma, basta solicitar a screen 4 vezes aos 4 IPs diferentes: Agora, sinceramente não testei e desculpem amigos do forum se falei besteira... mas se colocares 4 IdTCPClients em seu form... podes fazer assim:
MeuForm.IdTCPClient01.Host := IPUsu;
MeuForm.IdTCPClient01.Connect;
MeuForm.IdTCPClient01.WriteLn(´SRN´);

Stm := TFileStream.Create(Tmp + ´telaest01.jpg´,fmCreate);

try while MeuForm.IdTCPClient01.Connected do
       MeuForm.IdTCPClient01.ReadStream(Stm,-1,true);
except end;

FreeAndNil(Stm);

If FileExists(Tmp + ´telaest01.jpg´) Then
begin
  MeuForm.ImagemTela01.Picture := nil;
  MeuForm.ImagemTela01.Picture.LoadFromFile(Tmp + ´telaest01.jpg´);
  Application.ProcessMessages;
  MeuForm.Refresh;
end
Else begin
  MeuForm.ImagemTela01.Picture := nil;
end;

MeuForm.IdTCPClient01.Disconnect;
... onde tiver 01 basta alterar para a estação que quiser carregar ... ou trabalhas com [b:01f2286447]For[/b:01f2286447] ou duplicas o códigos estaticamente 4 vezes... vai depender do quanto seu sistema deverá ser dinâmico... no meu caso, acabei de saber que precisarei fazer tipo uma recepção (câmeras de segurança) então na minha tela o bendito do usuário terá a opção de selecionar quantas e quais as telas que ele quer ver ao mesmo tempo na tela... ainda estou pensando no código, mas já sei de antemão que terei que criar tudo em tempo de execução !!! Vai dar um trabalho !!! :cry:


não meu amigo, eu não quero solicitar as imagens através do cliente e sim através do servidor como faço hoje sem problemas...
hoje eu faço assim: como eu tenho uma lista dos clientes conectados, faço tenho um timer q a cada segundo paça para um novo cliente na lista (listbox) e solicito a imagem do cliente selecionado, sendo que, a imagem fica em um único timage, mais gostaria de colocar cada imagem em seu devido tImage, e estou tendo dor de cabeça para tals...
entendeu agora?
vlw :lol:


Responder Citar

29/03/2006

Paulocesar1301

Posso estar escrevendo besteira, mas no idTCP(Client/Server) o Server é que fica nas máquinas cliente e vice-versa... então quem solicita as imagens é o Client :wink:


Responder Citar

29/03/2006

Paullsoftware

Posso estar escrevendo besteira, mas no idTCP(Client/Server) o Server é que fica nas máquinas cliente e vice-versa... então quem solicita as imagens é o Client :wink:


[list=]O Sistema que fica nas estações possui apenas um idTcpClient
O Sistema que fica no Servidor possui apenas um idTcpServer[/list]

funciona perfeitamente o envio e recebimento de imagem por stream, como mencionei...
não meu amigo, eu não quero solicitar as imagens através do cliente e sim através do servidor como faço hoje sem problemas...

como eu disse já estou enviando numa boa a imagem do client para o server sem problemas, o quero que quero é uma ideia de como criar uma área de monitoramento para exibir as telas de todos os terminais em um form com 4 timages por exemplo. esse é meu problema! :cry:


Responder Citar