PDA

Ver la Versión Completa : Problema con TIdTcpServer y TIdTcpClient de las Indy...


AFilth
14-12-2007, 08:04:45
Buenos días a todos,

os cuento, estoy intentando desarrollar una aplicación en la cual, por una lado tenemos un servidor implementado con el componente TIdTcpServer de las Indy y el resto son clientes que tienen el TIdTcpClient de las indy también.

Para realizarlo, me he fijado en el ejemplo de las Indy del chat, el cual tiene el mismo esqueleto.

Cuando yo abro comunicación entre un cliente y el servidor todo funciona bien, los datos llegan del cliente al servidor y la respuesta del servidor al cliente.

El problema es el siguiente, yo quiero en determinados momentos, mandar mensajes del servidor al cliente sin que éste me haga ningún tipo de petición. Para lograr ésto, tengo una lista de los clientes con sus TIdPeerThread guardados para luego poder comunicarme con ellos por el "canal de comunicación" que éste me abrió cuando se conectó.

Para ello, pongo un Timer en el cliente y cada medio segundo en el timer hago lo siguiente:
procedure TForm2.TimerTimer(Sender: TObject);
var
Msg: String;
begin
//Cada cierto tiempo tendremos que estar mirando si nos llega algo del servidor
if not IdTcpClient.Connected then
exit;

Msg := IdTCPClient.ReadLn('', 5); //El 5 es un timeout para que no se quede ahí anclado siempre
if Msg <> '' then
MemoLog.Lines.Add(Msg);
end;

Pues no me funciona...(el ejemplo de ls Indy tampoco :))
El problema está en la línea
Msg := IdTCPClient.ReadLn('', 5);
Se me queda ahí parado el cliente sin hacer caso al timeout.
Si fuerzo enviar un mensaje desde el servidor, éste llega con datos y el cliente lo lee y sigue adelante pero como a los 0,5 seg vuelve a entrar en el timer sucede lo mismo...

Porqué no funciona el timeout? como debería hacerlo??

Un saludo y muchas gracias.

JXJ
14-12-2007, 17:59:36
encierra tu codigo dentro de un bloque try
para saber que error sale, aun no se como usar el bloque try except
pero es algo como abajo


procedure TForm2.TimerTimer(Sender: TObject);
var
Msg: String;
begin
//Cada cierto tiempo tendremos que estar mirando si nos llega algo del servidor
if not IdTcpClient.Connected then
exit;

try
Msg := IdTCPClient.ReadLn('', 5); //El 5 es un timeout para que no se quede ahí anclado siempre
if Msg <> '' then
MemoLog.Lines.Add(Msg);
end;
except
end

AFilth
14-12-2007, 20:32:50
Creo que no me has entendido bien...el problema no es por no usar el try except, que por cierto eso...eso de poner try y no poner nada en el except...ufff.

El problema viene de que no se está haciendo caso al timeout del readln.

A alguien se le ocurre algo? Como trabajais cuando haceis una aplicación cliente/servidor?

Salu2.

AFilth
15-12-2007, 17:30:54
Nadie usa estos componentes de las indy??

JXJ
15-12-2007, 23:28:59
a mi me ayudo usar el componente eureka
en algunos errores, raros me llego un mensaje de invalid handler

que version de las indys, estas usando la 9 de delphi 7 a alguna de
las versiones 10.x
o la 10.1.5 que viene con el IDE delphi 2005, 2006, 2007

AFilth
17-12-2007, 09:02:49
Estoy usando la versión 9 de las indy con Delphi 7. Si algún moderador ve este hilo me lo podría mover al foro de internet que creo que sería más apropiado...

PD: No me dí cuenta de que debería haberlo puesto allí al principio...