Array
(
)

Algumas Dúvidas sorbe idTCPClient e idTCPServer!!

Paullsoftware
   - 20 fev 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...
#Código

ClientSocket1.Socket.SendText(Edit1.Text);


e no evento
#Código
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 http://www.indyproject.org/Sockets/Demos/index.en.iwp mais não fiquei com essas dúvidas, alguém poderia me dar uma ajuda???


Delphi32
   - 20 fev 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;


Paullsoftware
   - 21 fev 2006

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


Paullsoftware
   - 21 fev 2006


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


Massuda
   - 21 fev 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.


Paullsoftware
   - 21 fev 2006

ok massuda...


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


Massuda
   - 21 fev 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ê.


Paullsoftware
   - 21 fev 2006


Citação:
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 client manda para o servidor o comando Hora ele recebe, até ai tudo bem posso tratar no evento OnExecute do meu servidor e dar uma resposta certo?

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

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 servidor no meu cliente :oops:


Massuda
   - 21 fev 2006


Citação:
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 servidor no meu cliente
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...#Código

// 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;



Paullsoftware
   - 21 fev 2006

hum...

agora sim massuda, valeu!


Paullsoftware
   - 21 fev 2006

fiz o teste e funcionou legal...

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


Massuda
   - 21 fev 2006


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


Paullsoftware
   - 21 fev 2006

ok!


Paullsoftware
   - 26 mar 2006


Citação:

Citação:
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 servidor no meu cliente
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...#Código

// 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;

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:


Kroki
   - 26 mar 2006

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