Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema de conexion con Sockets (https://www.clubdelphi.com/foros/showthread.php?t=87812)

JuanOrtega 28-02-2015 21:10:25

Problema de conexion con Sockets
 
Hola estoy haciendo un chat en una aplicacion de consola en delphi y tengo un problema con el siguiente codigo :

Código Delphi [-]
program chat;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Win.ScktComp, idContext, idGlobal;

var
  ClientSocket1: TClientSocket;
  m: TMethod;

Procedure leer_datos(Sender: TObject; Socket: TCustomWinSocket);
Var
  Raw: String;
Begin
  Raw := Socket.ReceiveText;
  Writeln(Raw);
End;

begin
  try

    ClientSocket1 := TClientSocket.Create(nil);
    ClientSocket1.Address := '127.0.0.1';
    ClientSocket1.Port := 123;
    ClientSocket1.Open;

    m.Code := @leer_datos;
    m.Data := ClientSocket1;
    ClientSocket1.OnRead := TSocketNotifyEvent(m);

    while '1'='1' do
    begin
      //
    end;


except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;

end.

El problema es que el evento para leer el codigo de respuesta del servidor nunca llega , parece que hice mal el evento OnRead en la aplicacion de consola.

¿ Cual es el problema ?

Ñuño Martínez 03-03-2015 11:05:31

Cita:

Empezado por Lepuke (Mensaje 489482)
¿ Cual es el problema ?

No estoy seguro al 100%, pero yo diría que no asignas correctamente el evento.

En primer lugar, no tienes que usar TMethod. En segundo lugar, asignas el manejador del evento después de abrir el socket, así que normal que no lo llame porque no le das oportunidad.

Mira a ver si lo siguiente funciona (no tengo Delphi [ni Windows] en este momento, así que no puedo comprobarlo yo):
Código Delphi [-]
program chat;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Win.ScktComp, idContext, idGlobal;



  TYPE
  (* Mi Aplicación. *)
    TMiAplicacion = CLASS (TObject)
    PUBLIC
      PROCEDURE leer_datos (Sender: TObject);
    END;



  Procedure TMiAplicacion.leer_datos(Sender: TObject);
  Begin
    WriteLn (TCustomWinSocket (Socket).ReceiveText)
  End;

var
  MiApp: TMiAplicacion;
  ClientSocket1: TCustomWinSocket;
begin
  try
    MiApp := TMiAplicacion.Create;

    ClientSocket1 := TClientSocket.Create(nil);
    ClientSocket1.Address := '127.0.0.1';
    ClientSocket1.Port := 123;

    ClientSocket1.OnRead := @MiApp.leer_datos;

    ClientSocket1.Open;

    while '1'='1' do
    begin
      //
    end;


except
  on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
end;
  FreeAndNil (ClientSocket1);
  FreeAndNil (MiApp)
end.
En cualquier caso, quizá te venga bien echarle un vistazo a la biblioteca Synapse.

Y una pregunta, ¿Delphi no tiene una clase TCustomApplication, como Lazarus? Si es así, también te recomiendo que la uses porque te facilitará las cosas. En cualquier caso, un objeto "Aplicacion" casi siempre es útil, sobre todo en aplicaciones complejas.


La franja horaria es GMT +2. Ahora son las 13:37:46.

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