Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

enviar datos a un programa de en un equipo remoto

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: enviar datos a un programa de en un equipo remoto Responder citando

Hola a todos:

voy a empezar una aplicacion nueva y antes de empezar me gustaria que me dieseis vuestra opinion:
en la nueva aplicación voy a utilizar una base de datos DBisam, y otra aplicacion que van a correr en otras maquinas remotas que van a eviar datos a la aplicación para que se inserten en una tabla.
¿Como puedo conseguir hacer esto?, o cual es manera mas eficaz?
Es la primera vez que voy a comunicar dos aplicacines y ademas están en equipos remotos.
Muchas gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola
Existen varias maneras algunas es usando componente de terceros, pero dentro de las paletas de Builder viene 2 TCPClient y TCPServer, los 2 permiten el envio y recepcion de datos, si tienes algunas versiones mas nuevas puedes usar, los componentes de la paleta INDY que funcionan muy similar, de echo yo uso los componentes para comunicar mis aplicaciones y hasta el momento no he tenido problema.

(TIdTCPCliente y TIdTCPServer <- de la paleta Indy)

claro, la manera de usarse es algo sencilla, en una aplicacion pones el componente que sirve de Servidor (TIdTCPServer) y en las aplicaciones que van a conectarse usas el TIdTCPClient, un ejemplo sencillo seria el siguiente.

por ejemplo para recibir información del lado del servidor, puedes usar algo como esto:

en el evento 'Execute' del componente del servidor podemos usar una funcion pre-definida, esto hace que cada conexion a la que se conecte se le genere un hilo independiente si se conectan 2 o mas clientes al mismo tiempo.

Código:
void __fastcall TForm1::IdServerExecute(TIdContext *AContext)
{
   this->ProcesarPeticiones(AContext);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ProcesarPeticiones(TIdContext *AContext)
{
   TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(AContext->Connection->IOHandler);
   IOH->LargeStream = true;
   AnsiString s = IOH->ReadLn();
   AnsiString sCommand;
   AnsiString sAction;
   s = UpperCase(s);
   sCommand = s.SubString (1,3).UpperCase();
   sAction = s.SubString(5,s.Length()-4);
   try
   {

      if (sCommand == "HLA")
      {
      ::ShowMessage("Enviaron el comando HLA");
      }

   }
   catch(Exception *AException)
   {
      ::ShowMessage("Error en conexion");
   }
}
//---------------------------------------------------------------------------

Del lado de los clientes puedes usar algo similar a esto, para 'Enviarle' al servidor los comandos que necesites se procecen por parte de el.


Código:
this->IdTCPCliente->Host = "xxx.xxx.xxx.xxx"; //<-- IP del servidor
if (this->IdTCPCliente->Connected())
   this->IdTCPCliente->Disconnect();
this->IdTCPCliente->Connect();
TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(this->IdTCPCliente->IOHandler);
if(IOH->Connected())
{
   IOH->WriteLn("HLA"); // Envio del comando Servidor
}


Este ejemplo es una forma sencilla de 'Pedirle' al servidor que realice cosas por nosotros, tambien el servidor puede enviarnos información si sabe nuestra direcciop IP desde donde nos estamos conectando.


por ultimo asegurate que los componentes esten en el mismo 'port' y que usen la IPVersion = Id_IPv4
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César:

muchas gracias por tu respuesta, me ha servido de mucho para empezar entender.

Si no entiendo mal, puedo mandar un String SQLstring, entonces le va a llegar al servidor la cadena para que la ejecute con DBisam, por cierto, me recomiendas DBisam?

Si yo envio una cadena desde un cliente, puedo enviar una respuesta a cada máquina que este conectada en ese momento, lo que necesito es saber la IP de cada una. Como puedo enviar un mensaje a toda la red para que me responda cada maquina y asi saber la ip de los que estan conectados para reponderles "hola"?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Isa1976, analizando un poco, considero que el motor de base de datos DBisam, debe contar con una tecnológia cliente<-->server, seria interesante ver la forma en que se conecta a travez de una red, No tengo el programa para instalarlo pues al parecer es de pago, considerando eso imagino que el soporte es bueno.

Por otra parte con respecto a los sockets, cuando un cliente se conecta automatiamente le envia la su IP al servidor, asi el servidor puede mantener una relacion de las máquinas que se encuentran conectadas con él.

Si estas dentro de una Red local es relativamente sencillo y digo relativamente, pues dependiendo del segmento de red xxx.xxx.sss.sss
puedes ubicar a tus equipos. para explicarte trataré de hacer los menos extenso.
Supongamos tienes un Servidor en un LAN con la IP 192.168.x.x o con la IP 172.16.x.x tienes un servidor con la IP 10.0.x.x

Si te das cuenta son los segementos de IP-pública-privada Todas Absoultamente todas las redes que tenga un Access Point o un Router o un HUB, en su mayoria usan esto 3 tipos de red conocidos.

Realmente lo que interesa es el Tercer Segmento donde esta la primera x
pues es el que nos dice el tipo de red a la que pertenecmos
para entenderlo un poco mas, una red podemos nombrarla de esta manera aun que mucha gente la llama como quiera

192 -> Red.
168 -> Sub-Red
xxx -> Segmento
xxx -> Número de Máquina

Si quieres enviar un mensaje a las maquinas, estamos hablando que tendrias que enviar dentro de un ciclo for que inicie de la posicion 0 hasta la poscion 255 como "Número de máquina"

Digamos algo como esto

Código:
for(int nmaquina = 0 ; nmaquina < 255; nmaquina++)
     EnviarPregunta("Activa","172.16.1."+IntToStr(nmaquina);


Indicando que la funcion EnviarPregunta, lleva dos parametros,
1.- el mensaje a Enviar
2.- la dirección destino de la máquina que recibe el mensaje.

esto solo funcionaría para las maquinas que estan en 172.16.1.x, donde "x" es un numero entre 0 y 255 que representa al número de la máquina.

(uff y dije que seria breve, jejej)

Entonces usando la forma de "Enviar" y "Recibir" que he mencionado en la respuesta anterior, puedes implementar una sencilla rutina de comunicación entre tu servidor y las estaciones que esten dentro de el rango espesificado.

Si cambias la parte que he denominádo Segmento por otro numero, estas hablando que las computadoras aún cuando esten en la misma red y sean maquinas que estan a tu lado, pertenecen a otra red
ejemplo:
172.16.1. (0 a 255) Esta es un Red Local
172.16.2. (0 a 255) esta es otra red que puede estar en el mismo edificio, y aun estando conectadas en el mismo Router o Access Point, las maquinas no se conocen.

Bueno espero que esta explicación pueda ayudarte, y cualquier cosa por aqui andamos y disculpa no haber dado una respuesta antes. pero andaba un poco ocupado.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias Cesar:

Tu ayuda me ha servido mucho para entender como lo voy a hacer.
Como me has explicado si tengo una maquina servidor y otras clientes, puedo hacer que cada maquina cliente al iniciar la aplicacion envie un mensaje (que ya lleva la IP) al servidor, cada IP la guardo un listbox y asi tengo la lista de IPs de mi red (solo las maquinas clientes que utilizan el programa cliente). El programa cliente puede enviar al servidor una String que contenga una sentencia SQL para que en el servidor la ejecute, por ejemplo: un insert con sus datos. Asi cada cliente puede insertar datos en la DB del servidor.
Lo que quiero hacer ahora es que cada vez que un cliente haga un cambio en la DB se vea reflejado en cada programa cliente. Para eso cada vez que algun cliente inserte un dato en la DB del servidor, el servidor enviara ese dato a cada DB de cada cliente (a cada IP de la lista) para que esten actualizados todos. De esta forma tendriamos en cada cliente una copia de la DB. No se si es buena idea hacerlo asi o mejor cada vez que un cliente quiera ver un dato, que envie una peticion al servidor y el servidor le responda con ese dato.
No se que seria mas rapido o mejor es este caso.
Si me puedes dar tu opinion podria ayudarme bastante.

Muchas gracias por todo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.