Algumas Dúvidas sorbe idTCPClient e idTCPServer!!

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

Respostas

20/02/2006

Delphi32

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;


Responder Citar

21/02/2006

Paullsoftware

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


Responder Citar

21/02/2006

Paullsoftware

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?


Responder Citar

21/02/2006

Massuda

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.


Responder Citar

21/02/2006

Paullsoftware

ok massuda...


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


Responder Citar

21/02/2006

Massuda

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ê.


Responder Citar

21/02/2006

Paullsoftware

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:


Responder Citar

21/02/2006

Massuda

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;



Responder Citar

21/02/2006

Paullsoftware

hum...

agora sim massuda, valeu!


Responder Citar

21/02/2006

Paullsoftware

fiz o teste e funcionou legal...

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


Responder Citar

21/02/2006

Massuda

...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.


Responder Citar

21/02/2006

Paullsoftware

ok!


Responder Citar

26/03/2006

Paullsoftware

[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:


Responder Citar

26/03/2006

Kroki

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


Responder Citar