Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Server Indy 10 (https://www.clubdelphi.com/foros/showthread.php?t=82439)

fenixariel 07-03-2013 06:27:39

Server Indy 10
 
Hola amigos del club.

Me encontre con un problema, y es el siguiente:

Tengo un cliente(no Indy) que intenta conectarse con un servidor Indy; este ultimo sabe cuando se conecto y desconecto el cliente(no Indy), pero no lee la trama que le fue enviada.

Creo que debe ser por el formato que en particular se comunican tanto un cliente(Indy) y el servidor Indy.

Como puedo hacer para que un cliente no usando Indy envie exitosamente una trama de datos a un servidor Indy.


Agradezco de antemano su ayuda.....


Saludos.

cointec 30-03-2013 12:01:55

Hola, la comunicación mediante sockets es transparente a los componentes que uses, lo único que tienes que programar es que ambos lados lean mediante los mismos protocolos. Yo utilizo indy y me conecto principalmente con clientes/servidores no indy y no tengo ningún problema.

¿Cómo procesas en el servidor las tramas que te envían desde el cliente? Qué código tienes en el evento onexecute?

fenixariel 31-03-2013 18:30:32

Código Delphi [-]

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
    Memo1.Lines.Add(DateTimeToStr(now) + ' ' + 'Connectado a : ' + AContext.Binding.PeerIP + '- Port:' + IntToStr(AContext.Binding.Port));
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
    Memo1.Lines.Add(DateTimeToStr(now) + ' ' + 'Desconectado de : ' + AContext.Binding.PeerIP + '- Port:' + IntToStr(AContext.Binding.Port));
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    Command: string;
    Size: integer;
    textoRecibido: string;
begin
    if AContext.Connection.Connected then
    begin
       
          Command := '';
          Command := AContext.Connection.Socket.ReadLn;
   
          Size := AContext.Connection.IOHandler.ReadLongInt(true);
          textoRecibido := AContext.Connection.IOHandler.ReadString(Size);
          AContext.Connection.IOHandler.WriteLn('Enviado');         
       
          Memo1.Lines.Add(DateTimeToStr(now) + ' - ' + AContext.Binding.PeerIP + ' : ' + Command);
    end;
end;


Probe enviandole mensajes desde Hercules tambien, pero solo puedo ver el momento que se conecta o desconecta el cliente pero no asi los datos enviados.



Saludos.

cointec 05-04-2013 20:59:31

Hola, no sé si te estará ocurriendo que se bloquee la aplicación, ya que no puedes manipular desde un thread componentes de VCL, y el evento on execute se lanza desde un thread. En el ejemplo que has mostrado, el evento onexecute se ejecuta desde un hilo que se crea para la conexión y no deberías acceder a Memo1. Por otro lado, no sirve de nada comprobar Código Delphi [-]AContext.Connection.Connected

, ya que si no hay conexión, no se lanza el evento onexecute.

Yo utilizo el sistema que te muestro a continuación ( aunque adaptado a tu ejemplo) en sistemas que tienen conectadas muchas máquinas por sockets y funciona a la perfección y sin problemas con volúmenes altos de mensajes 24x7x365. Sólo tienes que tener la precaución de sincronizar el thread principal de la aplicación con el thread de la conexión, cuando uno se tenga que comunicar con el otro para procesar los mensajes recibidos y para enviar mensajes, siempre que el procesamiento de los datos recibidos los realices en el thread principal.

Código:


Código Delphi [-]procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var Command: string;    Size: LongInt;    textoRecibido: string; begin    Command := AContext.Connection.Socket.ReadLn;    Size := AContext.Connection.IOHandler.ReadLongInt(true);    textoRecibido := AContext.Connection.IOHandler.ReadString(Size);    AContext.Connection.IOHandler.WriteLn( 'Enviado' );            TTCPServidorDatosRecibidos.DatosRecibidos( AContext, Command, textoRecibido);    end;  procedure TForm1.ProcesaDatosRecibidos( const AIP: string; const ACommand: string; const ATexto: string ); begin    Memo1.Lines.Add( DateTimeToStr(now) + ' - ' + AIP + ' : ' + Command );  end Yo utilizo    TTCPServidorDatosRecibidos = class(TIdNotify)    private      FContext: TIdContext;      FCommand: string;      FDatos: string;    protected      procedure DoNotify; override;    public      constructor Create( AContext: TIdContext; const ACommand: string; const ADatos: string ); reintroduce;      class procedure DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string );    end; constructorTTCPServidorDatosRecibidos.Create( AContext: TIdContext; const ACommand: string; const ADatos: string); begin    FContext  := AContext;   FCommand  := ACommand;    FDatos    := ADatos;    inherited Create; end;  procedure TTCPServidorDatosRecibidos.DoNotify; begin    inherited;    Form1.ProcesaDatosRecibidos( FContext.Binding.PeerIP, FCommand, FDatos ); end;  class procedure TTCPServidorDatosRecibidos.DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string); begin    TTCPServidorDatosRecibidos.Create( AContext, ACommand, ADatos ).Notify; end;


ASAPLTDA 08-08-2013 05:22:52

Cliente/server
 
Cita:

Empezado por cointec (Mensaje 458113)
Hola, no sé si te estará ocurriendo que se bloquee la aplicación, ya que no puedes manipular desde un thread componentes de VCL, y el evento on execute se lanza desde un thread. En el ejemplo que has mostrado, el evento onexecute se ejecuta desde un hilo que se crea para la conexión y no deberías acceder a Memo1. Por otro lado, no sirve de nada comprobar Código Delphi [-]AContext.Connection.Connected

, ya que si no hay conexión, no se lanza el evento onexecute.

Yo utilizo el sistema que te muestro a continuación ( aunque adaptado a tu ejemplo) en sistemas que tienen conectadas muchas máquinas por sockets y funciona a la perfección y sin problemas con volúmenes altos de mensajes 24x7x365. Sólo tienes que tener la precaución de sincronizar el thread principal de la aplicación con el thread de la conexión, cuando uno se tenga que comunicar con el otro para procesar los mensajes recibidos y para enviar mensajes, siempre que el procesamiento de los datos recibidos los realices en el thread principal.

Código:


Código Delphi [-]procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var Command: string;    Size: LongInt;    textoRecibido: string; begin    Command := AContext.Connection.Socket.ReadLn;    Size := AContext.Connection.IOHandler.ReadLongInt(true);    textoRecibido := AContext.Connection.IOHandler.ReadString(Size);    AContext.Connection.IOHandler.WriteLn( 'Enviado' );            TTCPServidorDatosRecibidos.DatosRecibidos( AContext, Command, textoRecibido);    end;  procedure TForm1.ProcesaDatosRecibidos( const AIP: string; const ACommand: string; const ATexto: string ); begin    Memo1.Lines.Add( DateTimeToStr(now) + ' - ' + AIP + ' : ' + Command );  end Yo utilizo    TTCPServidorDatosRecibidos = class(TIdNotify)    private      FContext: TIdContext;      FCommand: string;      FDatos: string;    protected      procedure DoNotify; override;    public      constructor Create( AContext: TIdContext; const ACommand: string; const ADatos: string ); reintroduce;      class procedure DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string );    end; constructorTTCPServidorDatosRecibidos.Create( AContext: TIdContext; const ACommand: string; const ADatos: string); begin    FContext  := AContext;   FCommand  := ACommand;    FDatos    := ADatos;    inherited Create; end;  procedure TTCPServidorDatosRecibidos.DoNotify; begin    inherited;    Form1.ProcesaDatosRecibidos( FContext.Binding.PeerIP, FCommand, FDatos ); end;  class procedure TTCPServidorDatosRecibidos.DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string); begin    TTCPServidorDatosRecibidos.Create( AContext, ACommand, ADatos ).Notify; end;


Hola Trate de enterder este ejemplo, pero mi conocimiento es demasiado basico, podras colocarcar un ejemplo de cliente/server para dummies
Por ejemplo que unidades debo adicionar para colocar el codigo
TTCPServidorDatosRecibidos = class(TIdNotify) como lo hace en la parte Yo utilizo

si es demasiado pedir ?


lo que trato de hacer es que una maquina1 se conecte a otra maquina 2, la mquina 1 envie un mensaje que corresponde a un nombre de documento padre , la maquina 2 debe responder con una lista de nombre de documentos el cual debe recibir la maquina 1 . Esto lo hago porque la maquina 1 tiene en su dioco duro una serie de archivos pdf que se deben imprimir en l maquina 1 , ya que la maquina 2 envia a imprimir en forma remota los documento debido al tamano de estos se demora demasiado y por tratamos de usar la alterntiva de tener los documentos en forma local y no remota

gracias por sus comentarios y observaciones

ASAPLTDA 08-08-2013 05:49:05

usando indy
 
Cita:

Empezado por fenixariel (Mensaje 457885)
Código Delphi [-]

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
    Memo1.Lines.Add(DateTimeToStr(now) + ' ' + 'Connectado a : ' + AContext.Binding.PeerIP + '- Port:' + IntToStr(AContext.Binding.Port));
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
    Memo1.Lines.Add(DateTimeToStr(now) + ' ' + 'Desconectado de : ' + AContext.Binding.PeerIP + '- Port:' + IntToStr(AContext.Binding.Port));
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    Command: string;
    Size: integer;
    textoRecibido: string;
begin
    if AContext.Connection.Connected then
    begin
       
          Command := '';
          Command := AContext.Connection.Socket.ReadLn;
   
          Size := AContext.Connection.IOHandler.ReadLongInt(true);
          textoRecibido := AContext.Connection.IOHandler.ReadString(Size);
          AContext.Connection.IOHandler.WriteLn('Enviado');         
       
          Memo1.Lines.Add(DateTimeToStr(now) + ' - ' + AContext.Binding.PeerIP + ' : ' + Command);
    end;
end;


Probe enviandole mensajes desde Hercules tambien, pero solo puedo ver el momento que se conecta o desconecta el cliente pero no asi los datos enviados.



Saludos.


HOLA EN TRUS pruebas no has avanzado algo que me pueda tambien ayudar avanzar, he llegado al mimo punto y el ejmplo del otro forista no lo entiendo como debo incluirlo,
gracias


La franja horaria es GMT +2. Ahora son las 14:59:06.

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