Conexión inversa
-
Upload
estuardo-de-leon -
Category
Documents
-
view
63 -
download
0
Transcript of 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:
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;
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:
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;
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.