Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Error Ejemplo Chat en Indy tcp (server & socket) (https://www.clubdelphi.com/foros/showthread.php?t=25186)

Clantt 14-09-2005 22:56:02

Error Ejemplo Chat en Indy tcp (server & socket)
 
Hoal a todos, m edispuse a aprender como se utilizan los Indy components con lo ejemplos libres que hay en nevrona pero el primer ejemplo del chat cuando el cliente se conecta con el servidor este se cuelga y como no se mucho de esto me quede out side al revisar esta es la parte del código que no funciona bien:
Código Delphi [-]
 procedure TForm1.Timer1Timer(Sender: TObject);
 var
   Com,
   Msg : String;
 begin
   if not IdTcpClient1.Connected then
     exit;
   Msg := IdTCPClient1.ReadLn('', 5);
   {
     parte que no funciona, todo este código esta dentro de un
     timer, a lo mejor tenga  que cambiar algo en el programa
     servidor?
   }
   // showmessage(Msg);
 
   if Msg <> '' then
   begin
     if Msg[1] <> '@' then
     begin
       { Not a system command }
       memLines.Lines.Add(Msg);
     end
     else
     begin
       { System command }
       Com := UpperCase(Trim(Copy(Msg, 2, Pos(':', Msg) -2)));
       Msg := UpperCase(Trim(Copy(Msg, Pos(':', Msg) +1, Length(Msg))));
       if Com = 'CLIENTS' then
         lbClients.Items.CommaText := Msg;
     end;
   end;
 end;
dicho sea de paso no encontre nada por la red para leerme como funcionan estos componentes, el ejemplo usado es el chat de indy 9.0 Por fa alguna ayuda de como solucionar ese bug o si alguien sabe un manuaa para leérmelo un poco. Mil gracias.

jachguate 15-09-2005 01:06:26

Cita:

Empezado por Clantt
dicho sea de paso no encontre nada por la red para leerme como funcionan estos componentes, el ejemplo usado es el chat de indy 9.0 Por fa alguna ayuda de como solucionar ese bug o si alguien sabe un manuaa para leérmelo un poco. Mil gracias.

En el sitio oficial de las INDY está también la documentación (de INDY 9 e INDY 10): documentación INDY.

Hasta luego.

;)

jachguate 15-09-2005 01:10:16

Cita:

Empezado por Clantt
Hoal a todos, m edispuse a aprender como se utilizan los Indy components con lo ejemplos libres que hay en nevrona pero el primer ejemplo del chat cuando el cliente se conecta con el servidor este se cuelga y como no se mucho de esto me quede out side al revisar esta es la parte del código que no funciona bien:

El código que publicaste no se ejecuta al conectarse un cliente... se está ejecutando constantemente en el cliente para leer los nuevos mensajes que pudiera enviar el servidor.

Te recomiendo seguir paso a paso la ejecución para determinar la instrucción exacta donde el programa se traba, y así será posible ayudarte.

Por último, comentar que este demo lo he compilado y usado muchas veces en los años anteriores, y nunca me ocurrió tal comportamiento. Probablemente haya algo dañado en tu instalación de windows.

Hasta luego

;)

Clantt 15-09-2005 01:54:48

Cita:

Empezado por jachguate

Por último, comentar que este demo lo he compilado y usado muchas veces en los años anteriores, y nunca me ocurrió tal comportamiento. Probablemente haya algo dañado en tu instalación de windows.

mmm al parecer no es problema de windows por que lo probé en tres máquinas con windows xp y nada el cliente se cuelga. si alguien lo puede revisar lo puede verificar. gracias

m@kio 15-09-2005 02:34:14

Yo lo resolvi de la siguiente forma...
 
Código Delphi [-]
     //Checar mensajes, se crea un hilo para ejecutar lo k se hace en el timer
     TMsj = class(TThread)
     protected
       procedure Execute; override;
     end;
   
   var
     //Se hace una variable del tipo k hicimos para despues crearla 
     ChecarMsj:TMsj;
   
   //Procedimiento cuando se ejecuta el hilo
   procedure Tmsj.Execute;
   var
     Msg : String;
   begin
    with form1 do
    begin
     if not IdTCPClient1.Connected then
       exit;
   
     Msg := IdTCPClient1.ReadLn('');
   
     if Msg <> '' then
       if Msg[1] <> '@' then
         begin
         { Not a system command }
           memLines.Lines.Add(Msg);
         end
    end;
   end;
   
   //Procedimiento del timer solo creas el hilo
   procedure TForm1.Timer1Timer(Sender: TObject);
   begin
   ChecarMsj:=TMsj.Create(false);
   end;

Pruebalo a mi me funciono espero k te sirva si no entiendes pues aki estamos para intentar ayudarte

Clantt 15-09-2005 15:38:20

Hola me da mucho gusto que me ayudaras, aún no lo probé pero se que funcionará. Como dije al principio estoy aprendiendo los componentes Indy y bueno en este código hay algunas cosas que no entiendo.


Cita:

Empezado por m@kio
Código Delphi [-]
//Creo la clase TMsj
 TMsj = class(TThread)
      protected
        procedure Execute; override;
      end;
    
    var
      //Declaramos una variable del tipo TMsj
      ChecarMsj:TMsj;
    
    //Procedimiento de la clase ¿Cuando se lo llama, ó Donde lo llamamos?
    procedure Tmsj.Execute;
    var
      Msg : String;
    begin
     with form1 do
     begin
      if not IdTCPClient1.Connected then
        exit;
    
      Msg := IdTCPClient1.ReadLn('');
    
      if Msg <> '' then
        if Msg[1] <> '@' then
          begin
          { Not a system command }
            memLines.Lines.Add(Msg);
          end
     end;
    end;
    
    //Creamos un objeto de la clase TMsj
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
 //¿Por que creamos al objeto con un parámetro booleano?
    ChecarMsj:=TMsj.Create(false);
    end;
 
 //¿dónde llamamos a Execute?


johncook 15-09-2005 15:52:58

Cita:

/¿Por que creamos al objeto con un parámetro booleano?
ChecarMsj:=TMsj.Create(false);
end;

//¿dónde llamamos a Execute?

Cuando creas el hilo, le indicas al mismo como crearse... Si el parámetro es false (CreateSuspended), significa que el hilo ejecuta una vez creado.
Creo que eso también responde tu pregunta sobre "donde se invoca el método Execute?".
Saludos.

Clantt 15-09-2005 16:39:44

Mil gracias ahora me voy a probarlo y bueno ademas ya se de donde leer sobre estos componetes. Con esto tengo trabajo hasta el fin de semana gracias a todos.


La franja horaria es GMT +2. Ahora son las 02:09:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi