Conexão com TIdTCPServer e TIdTCPClient
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?
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
Curtidas 0
Respostas
Rodrigo_koga
18/09/2007
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...
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...
GOSTEI 0
Massuda
18/09/2007
...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.
GOSTEI 0
Lperosa
18/09/2007
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?
GOSTEI 0
Massuda
18/09/2007
...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);
Memo1.Lines.Add(TIdTCPClient.RealdLn()).
GOSTEI 0
Lperosa
18/09/2007
Esse IdTCPClient1.ReadLn(); que postei foi apenas explicativo, na verdade usei os mesmos parametros do exemplo. Tanto é que no proprio exemplo tb tranca.
GOSTEI 0
Lperosa
18/09/2007
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?
GOSTEI 0
Massuda
18/09/2007
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?GOSTEI 0
Lperosa
18/09/2007
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.
GOSTEI 0
Massuda
18/09/2007
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.GOSTEI 0
Lperosa
18/09/2007
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.
Mas senão, tranca após o client receber as mensagens server qdo conecta.
GOSTEI 0
Massuda
18/09/2007
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].
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].
GOSTEI 0
Lperosa
18/09/2007
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.
GOSTEI 0
Lperosa
18/09/2007
Vou tentar baixar essa 9.0.18. Mando a resposta depois.
Massuda, só instalei a versão 9.0.18 e funcionou.
Valeu.
GOSTEI 0