GARANTIR DESCONTO

Fórum Conexão com TIdTCPServer e TIdTCPClient #346201

18/09/2007

0

Tenho uma aplicação cliente/servidor usando TIdTCPServer e TIdTCPClient, onde o cliente manda mensagem pro servidor e o servidor manda mensagem pro cliente.
Para o cliente receber uma mensagem do servidor coloquei um timer fazendo Memo1.Lines.Add(TIdTCPClient.RealdLn()). Porém o sistema tranca, e fica esperando uma mensagem do servidor. Quando o servidor manda a mensagem o memo é atualizado, porém continua trancado.
Alguem sabe como fazer para que a aplicação não fique trancada?


Lperosa

Lperosa

Responder

Posts

18/09/2007

Rodrigo_koga

Tipo assim cara...
Tenta explicar em mais detalhes o q vc precisa e o q vc quer dizer com ´tranca´, ele fica em stand-by esperando algum retorno do servidor, e pq vc usou um Timer???

Pelo q parece q vc esta querendo fazer um programa de comunicação é isso?
Caso seja existem exemplos onde vc pode ver como eh feito...

Outra coisa com relação a trancar acho q vc podia dar uma olhada no seu codigo pq alguma coisa esta bem estranha...

Posta ai qq coisa...

Flw...


Responder

Gostei + 0

18/09/2007

Massuda

...Alguem sabe como fazer para que a aplicação não fique trancada?
Imagino que isso ocorra quando o servidor manda uma mensagem para o cliente sem o cliente ter pedido a mensagem.

O modelo cliente/servidor do Indy baseia-se na idéia de que o cliente sempre toma a iniciativa no processo de comunicação, nunca o servidor inicia uma comunicação.

Como o Indy usa comunicação síncrona (bloqueia a thread até completar a operação de escrita/leitura), a solução que você usou sempre vai ´trancar´ o programa.

Dê uma olhada :arrow: [url=http://forum.devmedia.com.br/viewtopic.php?t=70214]neste tópico[/url], talvez te ajude.


Responder

Gostei + 0

18/09/2007

Lperosa

Massuda, na verdade fiz o teste tb no exemplo do chat da indy. Qdo o sistema cliente faz uma conexão com o servidor, recebe algumas mensagens da conexão e depois já tranca. Imagino que o seja por isso mesmo q vc falou, mas se for olhar pelo exemplo da indy, não tem lógica aquele chat, pq vc nunca vai conseguir conversar com ninguem, certo?


Responder

Gostei + 0

18/09/2007

Massuda

...mas se for olhar pelo exemplo da indy, não tem lógica aquele chat, pq vc nunca vai conseguir conversar com ninguem, certo?
Faz muito tempo que não compilo/rodo esse exemplo, mas se você olhar atentamente, verá que na rotina de timer o Readln está assim...
  Msg := IdTCPClient1.ReadLn(´´, 5);
...note o ´5´; ele indica quantos milésimos de segundo vai esperar por algum dado do servidor. No código que você postou...
 Memo1.Lines.Add(TIdTCPClient.RealdLn()).
...o Readln está ´sozinho´, sem parametros... nesse caso, isso indica ao Readln para esperar o tempo que for preciso por algum dado do servidor, por isso seu programa ´tranca´.


Responder

Gostei + 0

18/09/2007

Lperosa

Esse IdTCPClient1.ReadLn(); que postei foi apenas explicativo, na verdade usei os mesmos parametros do exemplo. Tanto é que no proprio exemplo tb tranca.


Responder

Gostei + 0

18/09/2007

Lperosa

Dê uma olhada :arrow: [url=http://forum.devmedia.com.br/viewtopic.php?t=70214]neste tópico[/url], talvez te ajude.


Dei uma lida neste tópico. Mas se for fazer desta mandeira, usando o componente Server no cliente e o Client no servidor, não seria mais lógico usar a conexão UDP?


Responder

Gostei + 0

18/09/2007

Massuda

Não tive tempo de olhar (de novo) o chat de exemplo.
...não seria mais lógico usar a conexão UDP?
O que te faz pensar que UDP tem relação com seu problema?


Responder

Gostei + 0

18/09/2007

Lperosa

Não tive tempo de olhar (de novo) o chat de exemplo.


Se vc olhar, me manda a resposta depois.

...não seria mais lógico usar a conexão UDP? O que te faz pensar que UDP tem relação com seu problema?


É o seguinte, a aplicação que tenho q fazer preciso executar tarefas tanto no servidor qto no cliente, cfe. as mensagens que os dois mandarem entre sí. Queria fazer por TCP pq tenho a relação de clientes conectads no servidor no proprio componente. Se fizer aquele esquema de client no servidor e server no cliente, não tenho mais essa lista pois será uma conexão de um para um. Então não seria mais lógico usar a UDP, pois com essa conexão eu enviaria mensagens sem precisar de confirmação.


Responder

Gostei + 0

18/09/2007

Massuda

Compilei o exemplo e experimentei abrir o servidor e 10 clientes... não percebi travamento algum. Talvez tenha problema com firewall ou coisa parecida?
...Então não seria mais lógico usar a UDP, pois com essa conexão eu enviaria mensagens sem precisar de confirmação.
UDP significa que o protocolo de transporte de dados não garante a entrega do pacote de dados. Isso implica que o servidor pode mandar uma mensagem e ela nunca ser recebida pelo cliente (e vice-versa) que o servidor nunca ficará sabendo. A não ser que você esteja transmitindo algo como áudio ou vídeo, geralmente faz falta um pacote de dados.


Responder

Gostei + 0

19/09/2007

Lperosa

Massuda, é estranho então, pq se eu comento a linha que tem no timer, não tranca, mas tb não recbe as mensagens, claro.
Mas senão, tranca após o client receber as mensagens server qdo conecta.


Responder

Gostei + 0

19/09/2007

Massuda

Qual versão de Indy você usa (8, 9 ou 10)? Se estiver usando a que veio com o Delphi, qual a versão do seu Delphi?

Seria interessante você atualizar seu Indy. Baixe o Indy 9.0.18 :arrow: [url=http://www.indyproject.org/Sockets/Download/Files/Indy9.en.aspx]desta página[/url]; essa é a última versão 9 oficial; existe outra ´não-oficial´, mais recente, que você pode obter via CVS ou de um dos sites de snapshot do Indy. Instruções para instalação, você encontra no meio :arrow: [url=http://forum.devmedia.com.br/viewtopic.php?t=57069]deste tópico[/url].


Responder

Gostei + 0

19/09/2007

Lperosa

Qual versão de Indy você usa (8, 9 ou 10)? Se estiver usando a que veio com o Delphi, qual a versão do seu Delphi?

Sim, estou usando a que veio com o delphi, Delphi 7.

Seria interessante você atualizar seu Indy. Baixe o Indy 9.0.18 :arrow: [url=http://www.indyproject.org/Sockets/Download/Files/Indy9.en.aspx]desta página[/url]; essa é a última versão 9 oficial; existe outra ´não-oficial´, mais recente, que você pode obter via CVS ou de um dos sites de snapshot do Indy. Instruções para instalação, você encontra no meio :arrow: [url=http://forum.devmedia.com.br/viewtopic.php?t=57069]deste tópico[/url].

Vou tentar baixar essa 9.0.18. Mando a resposta depois.


Responder

Gostei + 0

19/09/2007

Lperosa

Vou tentar baixar essa 9.0.18. Mando a resposta depois.


Massuda, só instalei a versão 9.0.18 e funcionou.
Valeu.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar