IdTCPServer, idTCPCliente

Delphi

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á

Rudá

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

04/01/2006

[quote:947d3e646a=´Rudá´]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??[/quote:947d3e646a]

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


GOSTEI 0
Rudá

Rudá

04/01/2006

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


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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:


GOSTEI 0
Kroki

Kroki

04/01/2006

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


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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:


GOSTEI 0
Paulocesar1301

Paulocesar1301

04/01/2006

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


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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?


GOSTEI 0
Paulocesar1301

Paulocesar1301

04/01/2006

Coloque Jpeg na Uses :wink:


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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?


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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:


GOSTEI 0
Rudá

Rudá

04/01/2006

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


GOSTEI 0
Paulocesar1301

Paulocesar1301

04/01/2006

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:


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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:


GOSTEI 0
Paulocesar1301

Paulocesar1301

04/01/2006

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:


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

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:


GOSTEI 0
Paulocesar1301

Paulocesar1301

04/01/2006

Brow... é exatamente igual a trabalhar com apenas um ... o único detalhe é que irás gastar mais recursos do equipamento ... fora isso funciona igual... fiz um teste básico com o que tinha aki (estático mesmo, sem intervenção do usuário... eu mesmo indiquei quais equipamentos deveria monitorar) e funcionou na boa...

PS.: se vai utilizar TImage com Stretch... aconselho colocar um duplo clique para o usuário poder ver a tela monitorada ocupando toda a screen, pq a imagem não fica lá essas coisas... no mais funcionou igual... sem muito trabalho em código, só copy and paste...


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

a ideia seria essa aqui
[img]http://img66.imageshack.us/my.php?image=imagem4vb.jpg[/img]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...


GOSTEI 0
Paullsoftware

Paullsoftware

04/01/2006

a ideia seria essa aqui [img]http://img66.imageshack.us/my.php?image=imagem4vb.jpg[/img] nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...

não funcionou a imagem...
a ideia seria essa aqui
[url=http://img56.imageshack.us/my.php?image=imagem3qy.jpg][img:e1b2571937]http://img56.imageshack.us/img56/7900/imagem3qy.th.jpg[/img:e1b2571937][/url]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...


GOSTEI 0
POSTAR