Conexión inversa

6
Conexión inversa Usando los componentes TClientSocket y TserverSocket En un artículo anterior vimos lo que era una conexión básica cliente servidor aprendimos como funcionaba y como implementarla usando Delphi 7 y dos componentes muy potentes. La conexión inversa es algo así como un "paradigma en la programación", que bien como los que ya saben, en una conexión cliente servidor el cliente se conecta al servidor y controla todo desde su máquina. Sin embargo una conexión inversa se refiere literalmente a que el servidor se conecte al cliente y este puede realizar funciones sobre el cliente, es algo bastante raro pues rompería el protocolo que ya conocemos, pero en realidad no es así. En la práctica en realidad el servidor no se conecta al cliente, de hecho la conexión inversa no existe, simplemente es una técnica para pasar los routers y firewalls que ya desde su uso masivo traen problemas ya que en una conexión básica siempre necesitaremos saber la IP del servidor, si su IP es dinámica perderemos el control en cualquier momento. Programación del "cliente" (Servidor) Paso 1: Agregamos el componente TServerSocket. Paso 2: En el evento OnCreate de nuestro form agregamos los parámetros para poner a la escucha:

Transcript of Conexión inversa

Page 1: Conexión inversa

Conexión inversaUsando los componentes TClientSocket y TserverSocket

En un artículo anterior vimos lo que era una conexión básica cliente servidor aprendimos como funcionaba y como implementarla usando Delphi 7 y dos componentes muy potentes.

La conexión inversa es algo así como un "paradigma en la programación", que bien como los que ya saben, en una conexión cliente servidor el cliente se conecta al servidor y controla todo desde su máquina.

Sin embargo una conexión inversa se refiere literalmente a que el servidor se conecte al cliente y este puede realizar funciones sobre el cliente, es algo bastante raro pues rompería el protocolo que ya conocemos, pero en realidad no es así.

En la práctica en realidad el servidor no se conecta al cliente, de hecho la conexión inversa no existe, simplemente es una técnica para pasar los routers y firewalls que ya desde su uso masivo traen problemas ya que en una conexión básica siempre necesitaremos saber la IP del servidor, si su IP es dinámica perderemos el control en cualquier momento.

Programación del "cliente" (Servidor)

Paso 1:Agregamos el componente TServerSocket.

Paso 2:En el evento OnCreate de nuestro form agregamos los parámetros para poner a la escucha:

1. procedure TForm1.FormCreate(Sender: TObject);2. begin3. ServerSocket1.Port:= 1234; // O puede ser directo de un TEdit (Este

es el puerto)4. ServerSocket1.Active:= True; // Lo activamos5. ServerSocket1.Open; // Se abre la conexión6. end;

(O podemos crear un botón que lea desde un TEdit y conecte... es como mucho mejor)

Con eso ya está nuestro Cliente (Servidor), pero igual... podemos agregar más cosas para mejorar, vamos a los eventos de nuestro componente TServerSocket.

Paso 3:

Page 2: Conexión inversa

Agregamos los eventos de control...En el evento OnClientError agregamos esto:

pascal Código:

1.procedure TForm1.ServerSocket1ClientError(Sender: TObject;2.  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;3.  var ErrorCode: Integer);4.begin5.ErrorCode:= 0;6.end;

Es por si se produce un error entonces mostramos un mensaje o simplmente lo anulamos usando la constante ErrorCode (vean como esta declarada en el procedure como integer), así que pongo 0 (cero).

Ahora cuando acepte una conexión quiero que me avise, entonces en el evento OnClientConnect agregamos:

pascal Código:

1.procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;2.  Socket: TCustomWinSocket);3.begin4.Label1.Caption:= 'Estado: Conectado';5.end;

Y en el evento OnClientDisconnect:

pascal Código:

1.procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;2.  Socket: TCustomWinSocket);3.begin4.Label1.Caption:= 'Estado: Desconectado';5.end;

Page 3: Conexión inversa

Claramente los mensajes se muestran en un Label pero pueden ponerlo desde un Statusbar.

Paso 4:Ahora deben poner las funciones, es decir la información que mandaremos a la otra pc...

Entonces en un botón lo que quieran ponen en orden los parámetros, primero el nombre del ocmponente, luego la constante "Socket" (que es donde recibe o envía datos... por cierto está constante se declara automáticamente...), luego el parámetro connections que indica a cuál de los ordenadores conectados queremos enviar un mensaje (entonces como si fuera un arreglo o matriz ponemos la posición de la conexión

Y por último el parametro SendText(), para envíar una cadena de caracteres)

pascal Código:

1.procedure TForm1.Button2Click(Sender: TObject);2.begin3.ServerSocket1.Socket.Connections[0].SendText('adios');4.end;

Eso es por si es solo una conexión, para los multiconexión es un poquito diferente...y listo eso es todo para nuestro Cliente (servidor).

Programando el "Servidor" (Cliente)

Bueno ahora programaremos lo que supuestamente llaman en los foros el "servidor", que en realidad viene siendo el cliente, simplemente porque así es la conexión inversa...

Paso 1:Agregamos el componente TClientSocket.

Paso 2:Ahora en el evento OnCreate del formulario cambiamos los parámetros de nuestro cliente para que empiece a buscar conexiones.

pascal Código:

Page 4: Conexión inversa

1.ClientSocket1.Address:= '127.0.0.1'; // esta es la IP REMOTA (nuestra IP o no-ip), pueden crear un Edit server

2.ClientSocket1.Port:= 1234; // el puerto3.ClientSocket1.Active:= True; // activamos4.ClientSocket1.Open;

paso 3:Ahora empezaremos a programar las funciones que recibe del computador que nos controla... hacemos clic en ell evento OnRead y agreamos...

pascal Código:

1.procedure TForm1.ClientSocket1Read(Sender: TObject;2.  Socket: TCustomWinSocket);3.  var4.  tales: String; // variable para guardar datos recibidos5.begin6.tales:= Socket.ReceiveText; // Con esto ponemos en la variable

string todo lo que recibimos7.If tales = 'hola' Then // si el string recibido es hola que

ejecute una función...8.Begin9.ShowMessage('Te saludan');10. End;11.  12. If tales = 'adios' Then // si el string recibido es

adios.. que ejecute otra función...13. Begin14. ShowMessage('Se despiden de ti');15. End;16.  17. end;

O pueden hacerlo con Case es como mejor también ... Y bueno en los demás eventos de nuestro servidor (Cliente) hacemos lo mismo que en nuestro Cliente:

pascal Código:

1.procedure TForm1.ClientSocket1Error(Sender: TObject;

Page 5: Conexión inversa

2.  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;3.  var ErrorCode: Integer);4.begin5.ErrorCode:= 0;6.end;

Por ejemplo en el evento OnClientError ponemos lo mismo que en el cliente... para que controle los errores...

Una aplicación de este tipo es verdaderamente útil cuando alguna empresa de servicios IT necesite ofrecer soporte remoto, tu podrías desarrollar una aplicación con este tipo de conexión.