TcpClient travando a aplicação.

Delphi

30/06/2005

Olá Galera.
É o seguinte, estou desenvolvendo um sistema de chat para a rede da empresa. Ai é o seguinte, o programa está todo certo, enviando e recebendo mensagens, porém quando eu envio uma mensagem para um host que nao esteja com o programa aberto, o meu programa trava.
O codigo que estou usando para enviar é o seguinte:
[b:87ce77598e]
TcpClient1.RemoteHost:=Edit2.text;
try
if TcpClient1.Connect then
TcpClient1.Sendln(Edit1.Text);
finally
TcpClient1.Disconnect;[/b:87ce77598e]

O que eu posso fazer para ele não travar mais? Existe alguma forma de verficar se o programa esta aberto na outra máquina?
Até mais e abraços


Lucianobarreto

Lucianobarreto

Curtidas 0

Respostas

Massuda

Massuda

30/06/2005

...quando eu envio uma mensagem para um host que nao esteja com o programa aberto, o meu programa trava.
Acho que o programa está tentando conectar com o host, pára de responder ao mouse/teclado e acaba dando a impressão de que está travado. Quando você tenta conectar com um host, o TCP/IP prevê um tempo ´grande´ para tentar até desisitir, já que não dá para saber se o host está na sua rede local ou do outro lado do mundo; assim, se o host estiver inativo, o tempo para saber isso é grande. Note que é a mesma coisa que acontece (ultimamente com frequencia) quando você tenta acessar este fórum e o servidor está fora do ar.

Seu código pode ser melhorado (um pouco) fazendo...
TcpClient1.RemoteHost:=Edit2.text;
if TcpClient1.Connect then begin
  try
    TcpClient1.Sendln(Edit1.Text);
  finally
    TcpClient1.Disconnect;
  end;
end;


...O que eu posso fazer para ele não travar mais?
Pode usar o TcpClient em modo ´não blocante´; no caso do TClientSocket seria ClientType=ctNonBlocking mas não sei dizer no momento como seria no caso do TTcpClient (não estou com um Delphi recente aqui), mas aí a programação fica muito mais complicada.


GOSTEI 0
Lucianobarreto

Lucianobarreto

30/06/2005

Obrigado pela resposta.
Testei o que voce me disse e não deu certo, o que acontece é o seguinte, o sistema esta mandando a mensagem mas ela nao está sendo entregue ao destinatario. Chega até a notificacao que a mensagem chegou, mas nao recebe nada...
O que será agora?


GOSTEI 0
Massuda

Massuda

30/06/2005

...o sistema esta mandando a mensagem mas ela nao está sendo entregue ao destinatario. Chega até a notificacao que a mensagem chegou, mas nao recebe nada...
Você alterou o modo de funcionamento do TcpClient de blocante para não-blocante? Nesse caso, o código acima não funciona (desculpe, relendo vi que isso não ficou claro no meu post).

Para trabalhar em modo não blocante, você teria que implementar seu processamento nos eventos do TcpClient (não tenho Delphi recente aqui, não sei dizer quais eventos seriam).

Modo blocante significa que o TcpClient processa um comando (por exemplo, o SendLn) até ele ser completado (a outra ponta receber todo o texto).

Em modo não-blocante, o TcpClient inicia o processamento de um comando (por exemplo, o SendLn) e retorna imediatamente; você só sabe quando um comando foi completado porque um evento é gerado pelo TcpClient. Nessa situação, geralmente se implementa um máquina de estados finitos (MEF) para ir acompanhando o processamento.

No seu caso, assumindo que você simplesmente mudou para modo não-blocante, o que acontece é que imediatamente após iniciar o envio de mensagem é feita a desconexão.

Você tem duas alternativas: ou continua usando o modo blocante e convive com o problema inicial (uma possível solução seria usar threads) ou muda seu programa (usando os eventos do TcpClient) e passa a usar modo não-blocante.


GOSTEI 0
POSTAR