Algumas Dúvidas sorbe idTCPClient e idTCPServer!!

Delphi

20/02/2006

pessoal quando usava delphi 5 trabalhei um pouco com Sockets, mais agora uso delphi7 e tem os componentes indy, as minhas dúvidas são as seguintes:

Com o ClientSocket eu fazia assim para enviar um comando para o servidor...
ClientSocket1.Socket.SendText(Edit1.Text);


e no evento
procedure TfClient.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var sRecebe : String;
begin
sRecebe := Socket.ReceiveText;
if sRecebe = ´#boot´ then
//comandos para desligar o pc
Listbox1.Items.Add(sRecebe);
end;

para tratar a respota do servidor...

Como faço isso com idTCPClient...

eu olhei os exemplos da página [url]http://www.indyproject.org/Sockets/Demos/index.en.iwp[/url] mais não fiquei com essas dúvidas, alguém poderia me dar uma ajuda???


Paullsoftware

Paullsoftware

Curtidas 0

Respostas

Delphi32

Delphi32

20/02/2006

A maneira mais simples de se fazer isso é:

Para enviar uma string para o servidor você usa no client:

TCPClient.WriteLn(´COMANDO´);

Quando o cliente envia a mensagem, o evento OnExecute do Servidor
é chamado. Você deve tratar o comando nesse evento:

var cmd:string;
begin

cmd := Athread.Connection.ReadLn;

end;


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

certo isso eu consigo tratar, mais e o idTCPClient como faço para tratar a resposta do servidor?


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

certo isso eu consigo tratar, mais e o idTCPClient como faço para tratar a resposta do servidor?


complementando a minha dúvida...

eu instalo nas estações o idTCPClient ou idTCPServer?

pq pela lógica os Clientes (idTCPClient) é que deveriam ser instalados nas estações e o servidor (idCTPServer) né isso...

sendo assim:
eu mando um comando do servidor (idCTPServer) para o cliente (idTCPClient) como faço para identificar e tratar esse comando no cliente?


GOSTEI 0
Massuda

Massuda

20/02/2006

Visite o [url=http://www.indyproject.org]site do Indy[/url] e baixe os exemplos [url=http://www.indyproject.org/Demos/index.iwp]desta página[/url] (como você está usando o Indy que veio com o Delphi, baixe os exemplos para o Indy 9); se tiver tempo, seria interessante você atualizar seu Indy.

Um exemplo que deve ser útil para você é o Chat.


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

ok massuda...


mais é justamente através dos exemplos que baixei que estou com essas dúvidas!


GOSTEI 0
Massuda

Massuda

20/02/2006

Os componentes Indy são para fazer cliente-servidor tradicional: o cliente envia um pedido, o servidor processa e retorna a resposta; o cliente deve estar aguardando a resposta.

Para mandar do servidor para o cliente, talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=70214]este tópico[/url] ajude você.


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

Os componentes Indy são para fazer cliente-servidor tradicional: o cliente envia um pedido, o servidor processa e retorna a resposta; o cliente deve estar aguardando a resposta. Para mandar do servidor para o cliente, talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=70214]este tópico[/url] ajude você.


certo massuda, foi de grande ajuda mais, ainda tenho não consegui solucionar todo meu problema... não sei se ainda não fui muito claro no que quero, vou tentar novamente...

tenho uma aplicação client (nas estações) e outra serv (no servidor) certo!

o meu problema é bem simples, digamos que o meu programa [b:e687cf1fab]client[/b:e687cf1fab] manda para o servidor o comando [b:e687cf1fab]Hora[/b:e687cf1fab] ele recebe, até ai tudo bem posso tratar no evento [i:e687cf1fab]OnExecute[/i:e687cf1fab] do meu [b:e687cf1fab]servidor [/b:e687cf1fab] e dar uma resposta certo?

mais como faço para no [b:e687cf1fab]client[/b:e687cf1fab] tratar o comando vindo do [b:e687cf1fab]servidor[/b:e687cf1fab]?
em que evento, metodo... essa é a minha dúvida!
deu pra entender agora? :cry:

eu consigo enviar um comando para o servidor, e consigo tb enviar uma resposta para o cliente. Só não consigo ler a resposta vinda do [b:e687cf1fab]servidor[/b:e687cf1fab] no meu [b:e687cf1fab]cliente[/b:e687cf1fab] :oops:


GOSTEI 0
Massuda

Massuda

20/02/2006

eu consigo enviar um comando para o servidor, e consigo tb enviar uma resposta para o cliente. Só não consigo ler a resposta vinda do [b:ecee5ea3e9]servidor[/b:ecee5ea3e9] no meu [b:ecee5ea3e9]cliente[/b:ecee5ea3e9]
Não tem evento algum. Como o Indy bloqueia a execução até uma operação de leitura/escrita completar, basta escrever tudo bem sequencial...
// exemplo de cliente enviando comando ao servidor
procedure TForm2.PedeSnapshot(var ASnapshot: TBitmap); 
var 
  Stream: TMemoryStream; 
  Size: Integer; 
begin 
  Stream := TMemoryStream.Create; 
  try 
    // envia comando
    IdTCPClient1.Writeln(´SNAPSHOT´);

    // pega a resposta, neste caso, vem em duas partes
    Size := IdTCPClient1.ReadInteger;
    IdTCPClient1.ReadStream(Stream, Size); 

    // faz alguma coisa com a Stream 
  finally 
    Stream.Free;  
  free; 
end;



GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

hum...

agora sim massuda, valeu!


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

fiz o teste e funcionou legal...

eu tenho sempre que tratar as duas partes, ou posso tratar somente com ReadLn??


GOSTEI 0
Massuda

Massuda

20/02/2006

...posso tratar somente com ReadLn??
Como você vai ler a resposta depende da resposta que seu servidor está mandando. No caso, o código que postei é parte de um exemplo meu em outro tópico, sobre como o servidor poderia mandar uma stream de dados para o cliente (primeiro manda o tamanho, depois a stream de dados).

Resumindo: depende unicamente das convenções que você adotou.


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

ok!


GOSTEI 0
Paullsoftware

Paullsoftware

20/02/2006

[quote:60da483dc4=´PaullSoftware´]eu consigo enviar um comando para o servidor, e consigo tb enviar uma resposta para o cliente. Só não consigo ler a resposta vinda do [b:60da483dc4]servidor[/b:60da483dc4] no meu [b:60da483dc4]cliente[/b:60da483dc4]
Não tem evento algum. Como o Indy bloqueia a execução até uma operação de leitura/escrita completar, basta escrever tudo bem sequencial...
// exemplo de cliente enviando comando ao servidor
procedure TForm2.PedeSnapshot(var ASnapshot: TBitmap); 
var 
  Stream: TMemoryStream; 
  Size: Integer; 
begin 
  Stream := TMemoryStream.Create; 
  try 
    // envia comando
    IdTCPClient1.Writeln(´SNAPSHOT´);

    // pega a resposta, neste caso, vem em duas partes
    Size := IdTCPClient1.ReadInteger;
    IdTCPClient1.ReadStream(Stream, Size); 

    // faz alguma coisa com a Stream 
  finally 
    Stream.Free;  
  free; 
end;
[/quote:60da483dc4]
Massuda, resgatei mais um tópico, pois tentei, tentei e não consegui fazer...
no código acima vc está solicitando uma stream do cliente para o servidor, ou seja, a tela copiada será o server.
O que estou tentando fazer é o inverso, copiar uma imagem da tela da estação e mostrá-la no servidor, isso eu não consegui fazer...
olhei o exemplo que vem com o indy, mais não consegui fazer para capturar a tela do cliente e mostrar no servidor... um luz ae.. :idea: :idea: :idea:


GOSTEI 0
Kroki

Kroki

20/02/2006

De uma olhada nesse código,ta completo;
[url]http://delphi.about.com/od/internetintranet/l/aa012004a.htm[/url]


GOSTEI 0
POSTAR