Fórum TcpClient travando a aplicação. #286548
30/06/2005
0
É 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
Curtir tópico
+ 0Posts
30/06/2005
Massuda
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;
Gostei + 0
30/06/2005
Lucianobarreto
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
30/06/2005
Massuda
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
Clique aqui para fazer login e interagir na Comunidade :)