idTcpClient pode ficar escutando os comandos do idTcpServer?
20/03/2006
0
O cliente faz uma pergunta o servidor responde, o servidor faz uma pergunta o cliente responde e assim por diante. Se o cliente fizer mais de uma pergunta por vez o servidor enviará uma reposta de cada vez até por que será feita uma resposta por vez:
IdTcpClient.WriteLn(‘#Comando’); ShowMessage(idTcpClient.ReadLn());
Minha dúvida é a seguinte: Se eu quiser enviar um comando do cliente para o servidor basta colocar um botão e fazer:
idClient.WriteLn(‘HORA’); //um exemplo para pedir a hora do servidor MsgResposta := idClient.ReadLn();//Aqui já pego a resposta do servidor, certo?
:arrow: :arrow: No servidor coloco no evento OnTcpServerExecute;
Var Msg : String; Begin Msg := UpperCase(idTcpServer.ReanLn()); If Msg = ‘#HORA’ then // se o cliente estiver pedindo a hora envio para ele uma resposta... idTcpServer.WriteLn(Time); …
Resumindo, sabemos que para ler as solicitações do cliente basta colocar uma instrução neste evento no servidor, certo? Mais e no cliente, como faço para aguardar os comandos do servidor. Tentei colocar um timer para ficar assim: :idea: :idea: :idea:
var msg : String; begin msg := ´´; if IdTCPClient.Connected then begin msg := IdTCPClient.ReadLn(); if msg <>´´ then begin ListBox1.Items.Add(msg); end else begin Exit; end; end; end;
Minha pergunta é tem como o cliente ficar escutando os comandos do servidor, sem ser nas seqüências abaixo?
IdTcpClient.WriteLn(‘#Comando’); ShowMessage(idTcpClient.ReadLn());
:?: :?: :?:
Paullsoftware
Posts
20/03/2006
Massuda
20/03/2006
Paullsoftware
type TReadingThread = class(TThread) protected FConn: TIdTCPConnection; procedure Run; override;//aqui da o erro! public constructor Create(AConn: TIdTCPConnection); reintroduce; end; TForm1 = class(TForm) ListBox1: TListBox; Edit1: TEdit; Button1: TButton; IdTCPClient: TIdTCPClient; SpeedButton1: TSpeedButton; Edit2: TEdit; SpinEdit1: TSpinEdit; ...
só resaultando, copiei e colei o código para testar! :roll:
20/03/2006
Massuda
20/03/2006
Paullsoftware
Reader.TerminateAndWaitFor;
aqui também é só terminate?? :?: :?:
20/03/2006
Massuda
Se preferir continuar a derivar de TThread, o TIdThread.TerminateAndWaitFor corresponde a chamar TThread.Terminate seguido de TThread.WaitFor.
20/03/2006
Paullsoftware
if idTcpClient.Connected then Reader := TReadingThread.Create(IdTCPClient);
20/03/2006
Massuda
20/03/2006
Paullsoftware
então isso é estranho não está funcionando assim...
vou fazer mais alguns testes e post o resultado! :wink:
20/03/2006
Paullsoftware
quando conecto a estação vem na hora a resposta do cliente:
idTcpServer.WriteLn(´Conectado com Sucesso!´);
mais depois disso se enviar algum comando do servidor não é executado, comente quando o cliente faz uma nova solicitação é mostrar a mensagem que o servidor havia enviado antes.. já quando eu coloco o timer, menseionado anteriormente funciona! o que pode ser?
20/03/2006
Paullsoftware
procedure TReadingThread.Execute; var Command: String; begin With fMain do begin if not IdTCPClient.Connected then Exit; repeat Command := UpperCase(FConn.ReadLn); if Command = ´#NET´ then FConn.WriteLn(´Desconectado do Servidor´)//ShowMessage(´Desconectado do Servidor´) else if Command = ´BLOCK´ then FConn.WriteLn(´Executado com sucesso!´)//ShowMessage(´Terminal Bloqueado´) else if Command = ´SHUTDOWN´ then FConn.WriteLn(´Executado com sucesso!´)//ShowMessage(´Desligar Terminal´) else if Command = ´LIBERA´ then FConn.WriteLn(´Executado com sucesso!´)//ShowMessage(´Terminal Liberado´) else if Command = ´REBOOT´ then FConn.WriteLn(´Executado com sucesso!´)//ShowMessage(´Reiniciar Terminal´) else if Command = ´TELA´ then FConn.WriteLn(´Executado com sucesso!´)//ShowMessage(´Enviar Tela do Terminal´) else if Command = ´#STOP´ then FConn.WriteLn(´Executado com sucesso!´);//ShowMessage(´Parar Tempo´); ListBox1.Items.Add(Command); Command := ´´; until not IdTCPClient.Connected; end; end;
a principio esta funcionando corretamente, mais o estranho é que quando estava usando as [b:84b1f1c973]ShowMessages();[/b:84b1f1c973] não estava funcionando, sabe informar pq? :?: :?: :?:
20/03/2006
Massuda
20/03/2006
Paullsoftware
valeu pelos toques, agora acho que vai dar pra continuar o desenvolvimento do projeto! :wink: obrigado mais uma vez...
problema solucionado! :twisted: :twisted:
21/03/2006
Paullsoftware
como desconectar ou enviar mensagem para todos os usuários conectados ao servidor???
não achei nos exemplos que olhei sobre o indy...
21/03/2006
Massuda
var List: TList; Peer: TIdPeerThread; ... List := IdTCPServer1.Threads.LockList; //isso bloqueia o servidor! try for I := 0 to List.Count - 1 do begin // List[I] é uma das threads do servidor Peer := TIdPeerThread(List[I]); Peer.Connection.WriteLn(´Oi´); end; finally IdTCPServer1.Threads.UnlockList; end;
21/03/2006
Paullsoftware
1 - Desconectar todos os Clientes;
2 - Desligar Todos os Clientes;
3 - Reiniciar Todos os Clientes;
4 - Liberar Todos os Clientes
algo desse tipo, tem problemas???
Clique aqui para fazer login e interagir na Comunidade :)