Array
(
)

IdTCPServer, idTCPCliente

Rudá
   - 04 jan 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??


Paullsoftware
   - 26 mar 2006


Citação:
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:


Rudá
   - 26 mar 2006

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


Paullsoftware
   - 26 mar 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:


Kroki
   - 26 mar 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.


Paullsoftware
   - 27 mar 2006


Citação:
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:


Paulocesar1301
   - 27 mar 2006

Capturando Tela:

#Código


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:

#Código

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:

#Código

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


Paullsoftware
   - 27 mar 2006


Citação:
Capturando Tela:

#Código


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:

#Código

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:

#Código

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
Citação:
jpg := TJPEGImage.Create;

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


Paulocesar1301
   - 27 mar 2006

Coloque Jpeg na Uses :wink:


Paullsoftware
   - 27 mar 2006


Citação:
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?


Paullsoftware
   - 28 mar 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:


Rudá
   - 28 mar 2006

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


Paulocesar1301
   - 28 mar 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:

#Código


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 For 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 !!!


Paullsoftware
   - 29 mar 2006


Citação:
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:

#Código


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 For 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 !!!

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:


Paulocesar1301
   - 29 mar 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:


Paullsoftware
   - 29 mar 2006


Citação:
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...

Citação:
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!


Paulocesar1301
   - 30 mar 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...


Paullsoftware
   - 30 mar 2006

a ideia seria essa aqui
Clique na imagem para abrir em uma nova janela
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...


Paullsoftware
   - 30 mar 2006


Citação:
a ideia seria essa aqui
Clique na imagem para abrir em uma nova janela
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...