Bom, primeiramente quero dizer que apesar desse ser meu primeiro post no fórum, já tirei muitas dúvidas aqui, e espero que possam me ajudar com essa. Estou fazendo um programa de Assistência Remota, com o envio da screenshot do ServerSocket através de stream. Já estou conseguindo emular os clicks do mouse e até teclas apertadas, apesar da função não estar muito boa, porém o problema não é esse. O lance é o seguinte, o meu código para envio do stream atual está assim no servidor:
Comando:=Socket.ReceiveText;
if Comando='screen' then
begin
{Aqui começa a função de Bitblt para pegar a imagem,etc...Não interessa pra nós }
jpg.SaveToStream(Stream);
Stream.Position:=0;
Socket.SendText('Screen:' + inttostr(Stream.Size) + #0); //Envio depois do Stream.Size o #0 para delimitar o Size sem misturar com o inicio da imagem
Socket.SendStream(Stream);
-----
Aí surgiu o problema, se no Socket.SendText eu ponho apenas Socket.SendText(inttostr(Stream.Size) + #0); sem o 'Screen:' funciona perfeitamente, porém aí no clientread lá no Cliente, eu não posso usar um if Comando='Screen:' ... E eu preciso disso, prq eu vou receber mais de 1 coisa no clientread e sem isso, é como se todo evento do read fosse uma screen...Abaixo segue o código do cliente para vocês visualizarem melhor:
if LeftStr(Chegando,7) = 'Screen:' then
begin
Delete(Chegando, 1, 7); //Deleto o 'Screen:' da var Chegando, pois ele é só pra identificar que é uma screen, não faz parte da coisa toda...
if not Receiving then //Se o BOOL Receiving ainda for falso(não estiver recebendo) eu pego o Stream.Size enviado e gravo na var stSize
begin
if pos(#0,Chegando) > 0 then //Se encontrar o delimitador #0 que enviei lá no server na var Chegando então...
stSize:=strtoint(copy(Chegando,1,pos(#0,Chegando)-1))//O StSize é o que veio antes dele, ou seja o Stream.Size
else
exit;
begin
Stream:=TMemoryStream.Create;//Crio o Stream
Receiving:=True;//Começo a receber
Delete(Chegando,1,pos(#0,Chegando));//Deleto o que tem antes do #0 ou seja Stream.Size pois não faz parte da imagem
end;
end;
try
Stream.Write(Chegando[1],Length(Chegando));//Começo a escrever o stream recebido
if Stream.Size = stSize then//Aqui me indica o problema,se nesse if eu ponho Stream.Size < stSize ele começa a exibir o inicio da img apenas,porém se fica = ou seja: quando o recebido e escrito, for igual ao stSize que é o Stream.Size enviado do servidor forem iguais,ou seja a img tiver sido recebida por completa...Eu ponho ela num componente Image1...Isso não interessa colar aki também...
---------------------
Bom pessoal, esse código funciona, desde que no servidor tire do Socket.SendText o 'Screen:' e no ClientOnRead ponha apenas começando o if Not Receiving, sem aquele if Chegando = 'Screen:' ....
Pelo que percebi é que o Stream.Size recebido pelo Cliente é sempre menor que o Stream.Size enviado...Parece que o Cliente não consegue receber a imagem toda,só o inicio...mas tenho certeza que o servidor envia a img toda...Prq já puis um ShowMessage lá, indicando o Stream.Size enviado e foi da img toda, porém o recebido pelo Cliente é um pedacinho só...Minimo... Espero que vocês possam me ajudar, tentei formatar o post o máximo possível para organizar as coisas, é bem complicado, mas leiam que vocês vão entender..
Pergunta
Dolfin
Bom, primeiramente quero dizer que apesar desse ser meu primeiro post no fórum, já tirei muitas dúvidas aqui, e espero que possam me ajudar com essa. Estou fazendo um programa de Assistência Remota, com o envio da screenshot do ServerSocket através de stream. Já estou conseguindo emular os clicks do mouse e até teclas apertadas, apesar da função não estar muito boa, porém o problema não é esse. O lance é o seguinte, o meu código para envio do stream atual está assim no servidor:
Comando:=Socket.ReceiveText;
if Comando='screen' then
begin
{Aqui começa a função de Bitblt para pegar a imagem,etc...Não interessa pra nós }
jpg.SaveToStream(Stream);
Stream.Position:=0;
Socket.SendText('Screen:' + inttostr(Stream.Size) + #0); //Envio depois do Stream.Size o #0 para delimitar o Size sem misturar com o inicio da imagem
Socket.SendStream(Stream);
-----
Aí surgiu o problema, se no Socket.SendText eu ponho apenas Socket.SendText(inttostr(Stream.Size) + #0); sem o 'Screen:' funciona perfeitamente, porém aí no clientread lá no Cliente, eu não posso usar um if Comando='Screen:' ... E eu preciso disso, prq eu vou receber mais de 1 coisa no clientread e sem isso, é como se todo evento do read fosse uma screen...Abaixo segue o código do cliente para vocês visualizarem melhor:
if LeftStr(Chegando,7) = 'Screen:' then
begin
Delete(Chegando, 1, 7); //Deleto o 'Screen:' da var Chegando, pois ele é só pra identificar que é uma screen, não faz parte da coisa toda...
if not Receiving then //Se o BOOL Receiving ainda for falso(não estiver recebendo) eu pego o Stream.Size enviado e gravo na var stSize
begin
if pos(#0,Chegando) > 0 then //Se encontrar o delimitador #0 que enviei lá no server na var Chegando então...
stSize:=strtoint(copy(Chegando,1,pos(#0,Chegando)-1))//O StSize é o que veio antes dele, ou seja o Stream.Size
else
exit;
begin
Stream:=TMemoryStream.Create;//Crio o Stream
Receiving:=True;//Começo a receber
Delete(Chegando,1,pos(#0,Chegando));//Deleto o que tem antes do #0 ou seja Stream.Size pois não faz parte da imagem
end;
end;
try
Stream.Write(Chegando[1],Length(Chegando));//Começo a escrever o stream recebido
if Stream.Size = stSize then//Aqui me indica o problema,se nesse if eu ponho Stream.Size < stSize ele começa a exibir o inicio da img apenas,porém se fica = ou seja: quando o recebido e escrito, for igual ao stSize que é o Stream.Size enviado do servidor forem iguais,ou seja a img tiver sido recebida por completa...Eu ponho ela num componente Image1...Isso não interessa colar aki também...
---------------------
Bom pessoal, esse código funciona, desde que no servidor tire do Socket.SendText o 'Screen:' e no ClientOnRead ponha apenas começando o if Not Receiving, sem aquele if Chegando = 'Screen:' ....
Pelo que percebi é que o Stream.Size recebido pelo Cliente é sempre menor que o Stream.Size enviado...Parece que o Cliente não consegue receber a imagem toda,só o inicio...mas tenho certeza que o servidor envia a img toda...Prq já puis um ShowMessage lá, indicando o Stream.Size enviado e foi da img toda, porém o recebido pelo Cliente é um pedacinho só...Minimo... Espero que vocês possam me ajudar, tentei formatar o post o máximo possível para organizar as coisas, é bem complicado, mas leiam que vocês vão entender..
Valeu!!
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.