Tuesday, 8 September 2009

Creando un dummy Server con idTCPServer (Indy 9)

Para crear un pequeño servidor para poder realizar nuestras pruebas utilizando paquetes TCP, podemos crear una aplicación utilizando el componente TidTCPServer para crear un servidor TCP al cuál podremos hacer diversas peticiones y que nos devuelva un valor por defecto y así poder hacer nuestras pruebas. De ésta manera podremos utilizar otros dispositivos para ver si realmente existe una comunicación entre éstos y poder controlar bien los datos enviados y recibidos. Para éste ejemplo utilizaré los componentes de Indy 9 ya que es bastante diferente que utilizar Indy 10. Para Indy 10, ya realizé una herramienta de xat la cuál la podréis encontrar aquí, en el siguiente enlace: Herramienta de xat con Indy 10.

Solo tenemos que crear una nueva aplicación, y utilizar los siguientes componentes:

TidTCPServer y TidAntiFreeze, los cuáles podremos encontrar en la librería de Indy. Una vez hecho esto, tenemos que configurar la aplicación con el siguiente código fuente:

procedure TForm3.ConnectClick(Sender: TObject);
var
    idSocket: TIdSocketHandle;
begin
    idSocket := IdTcpServer1.Bindings.Add;
    idSocket.IP := Edit2.text;
    idSocket.Port := StrToInt(Edit1.text);
    Log('Binding IP: ' + Edit2.text + ':' + Edit1.text);
    IdTcpServer1.Active := true;
end;

procedure TForm3.DisconnectClick(Sender: TObject);
begin
    IdTcpServer1.Bindings.Clear;
    IdTcpServer1.Active := false;
    Log('Disconnected');
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    DisconnectClick(Sender);
end;

procedure TForm3.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
    Log('Connected at : ' + AThread.Connection.Socket.Binding.PeerIP + ':' + IntToStr(AThread.Connection.Socket.Binding.Port));
end;

procedure TForm3.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
    Log('Disconnected from : ' + AThread.Connection.LocalName + ':' + IntToStr(AThread.Connection.Socket.Binding.Port));
end;

procedure TForm3.IdTCPServer1Execute(AThread: TIdPeerThread);
var
    CommBlock: string;
begin
    if not AThread.Terminated and AThread.Connection.Connected then
    begin
        AThread.Connection.WriteLn(1000); //default value
        CommBlock := AThread.Connection.ReadLn; //read from client
        Log('Received : ' + CommBlock + ' Sending value: ' + IntToStr(1000));
    end;
end;

procedure TForm3.Log(s: string);
begin
    Memo1.Lines.Add(DateTimeToStr(now) + ' ' + s);
end;


Una vez hecho ésto y asignados los eventos en el componente, podemos iniciar nuestro servidor y darle al botón conectar para iniciar el servidor. Aqui tenemos que utilizar la IP que hará de servidora y su puerto.

Si iniciamos una comunicación por ejemplo con Firefox (poniendo la IP y el puerto en la barra de navegación xxx.xxx.xxx.xxx : xxxx (en mi caso 192.168.1.1:8080) entonces recibiremos la siguiente respuesta en nuestra aplicación:

08/09/2009 15:33:24 Binding IP: 192.168.1.1:8080
08/09/2009 15:33:28 Connected at : 192.168.1.1:8080
08/09/2009 15:33:28 Received : GET / HTTP/1.1 Sending : 1000
08/09/2009 15:33:28 Received : Via: 1.1 SRVISA01 Sending : 1000
08/09/2009 15:33:28 Received : User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 Sending : 1000
08/09/2009 15:33:28 Received : Host: 192.168.1.1:8080 Sending : 1000
08/09/2009 15:33:28 Received : Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Sending : 1000
08/09/2009 15:33:28 Received : Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 Sending : 1000
08/09/2009 15:33:28 Received : Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Sending : 1000
08/09/2009 15:33:28 Received : Keep-Alive: 300 Sending : 1000
08/09/2009 15:33:28 Received : Connection: Keep-Alive Sending : 1000
08/09/2009 15:33:28 Received : Sending : 1000

4 comments:

  1. Sabes como mandar una imagen al navegador?

    ReplyDelete
    Replies
    1. Tienes que enviar un Stream. Hay varias maneras de hacerlo.

      Jordi

      Delete
  2. Hola amigo, se puede ejecutar una acción al momento de que reciba texto?. Por ejemplo mostrar el texto por medio de un showMessage

    ReplyDelete
    Replies
    1. Hola Hugo,

      si que se puede, solo tienes que usar la unidad del showMessage y mostrar el mensaje.

      Jordi

      Delete