PDA

Ver la Versión Completa : Problema de conexion con Sockets


JuanOrtega
28-02-2015, 21:10:25
Hola estoy haciendo un chat en una aplicacion de consola en delphi y tengo un problema con el siguiente codigo :

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
¿ 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):

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 (http://www.ararat.cz/synapse/doku.php/start).

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.