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:
[highlight=pascal]
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Port:= 1234; // O puede ser directo de un TEdit (Este es el puerto)
ServerSocket1.Active:= True; // Lo activamos
ServerSocket1.Open; // Se abre la conexión
end;[/highlight]
(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:
Agregamos los eventos de control...
En el evento OnClientError agregamos esto:
[highlight=pascal]procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:= 0;
end;[/highlight]
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:
[highlight=pascal]procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label1.Caption:= 'Estado: Conectado';
end;[/highlight]
Y en el evento OnClientDisconnect:
[highlight=pascal]procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label1.Caption:= 'Estado: Desconectado';
end;[/highlight]
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)
[highlight=pascal]procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.Socket.Connections[0].SendText('adios');
end;[/highlight]
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.
[highlight=pascal]
ClientSocket1.Address:= '127.0.0.1'; // esta es la IP REMOTA (nuestra IP o no-ip), pueden crear un Edit server
ClientSocket1.Port:= 1234; // el puerto
ClientSocket1.Active:= True; // activamos
ClientSocket1.Open;[/highlight]
paso 3:
Ahora empezaremos a programar las funciones que recibe del computador que nos controla... hacemos clic en ell evento OnRead y agreamos...
[highlight=pascal]
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
tales: String; // variable para guardar datos recibidos
begin
tales:= Socket.ReceiveText; // Con esto ponemos en la variable string todo lo que recibimos
If tales = 'hola' Then // si el string recibido es hola que ejecute una función...
Begin
ShowMessage('Te saludan');
End;
If tales = 'adios' Then // si el string recibido es adios.. que ejecute otra función...
Begin
ShowMessage('Se despiden de ti');
End;
end;[/highlight]
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:
[highlight=pascal]
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:= 0;
end;[/highlight]
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.
Fuente