Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-04-2010
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
Conexión bidirecional TCP

Hola. Utilizo los componentens Indy 9 para programar servidores o clientes TCP/IP de conexión.
El problema que tengo ahora es que necesito implementar un cliente que se conecte a un servidor, pero estableciendo una comunicación bidireccional iniciable por cualquiera de los dos extremos. Me explico:
- La aplicación cliente (que estoy desarrollando) se conecta a un servidor TCP/IP remoto a través de una ip y un puerto y envía una trama de login, a la que el servidor responde con OK (más o menos) si todo va bien.
- A las peticiones o comandos enviados por el cliente, el servidor responde en consecuencia según la operación.
- Ahora bien, de forma asíncrona y sin peteción previa del cliente, el servidor puede enviar tramas de información (petición de datos al cliente) o similar.

Es decir, aunque el cliente inicia la conexión y establece el canal TCP, el servidor a veces inicia el envío de un comando que no es respuesta de una petición del cliente.
Esto es lo que no sé como implementar. Con el componente idTCPClient inicio la conexión y envío tramas y espero respuestas, pero no tengo un evento como en el idTCPServer que se dispare cuando se reciba información.
No veo claro como implementarlo. Se me ocurre un temporizador y que cada cierto tiempo compruebe si hay algo en el buffer de entrada, pero no me parece muy adecuando.
¿Pueden darme alguna sugerencia?
Gracias.
Responder Con Cita
  #2  
Antiguo 27-04-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 15
manuc Va por buen camino
Hola Sur-se,

Creo que la mejor forma de hacerlo es establecer dos conexiones. Una para enviar información y otra para recibir.

Ambas conexiones las debería iniciar el cliente y el servidor debería identificar el tipo de conexión.

Tienes que tener en cuenta que al establecer una conexión (desde el cliente) con el servidor y dejarla en modo lectura del buffer, te congelará la aplicación cliente, por lo que tendrías que implementar esta parte en un hilo independiente.

Espero que te ayude.

Un saludo.
Responder Con Cita
  #3  
Antiguo 28-04-2010
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
Hola. Gracias por la respuesta, pero no puedo hacerlo así ya que el servidor no lo he programado yo y no se puede cambiar, por lo que no puedo establecer una conexión desde el servidor al cliente como indicas. Lo que pueda hacer debo programarlo desde el cliente.
He estado pensando en usar el componente idConnectionIntercept que tiene eventos para OnReceive y realizar un análisis previo de la información que llega para determinar si se trata de paquetes de respuesta a comandos o comandos propios del servidor.
Un saludo.
Responder Con Cita
  #4  
Antiguo 28-04-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 15
manuc Va por buen camino
Hola nuevamente,

Si interceptas la conexión para interpretar el paquete que te remite el servidor, (creo) que es lo mismo que si pones el cliente en lectura, esperando un paquete del servidor.

El problema de lo que planteas, es que el Cliente y el Servidor tienen que estar sincronizados. Es decir, cuando el cliente envía paquetes, el servidor tiene que estar a la espera de recibir paquetes. Cuando el servidor envía paquetes con respuestas, el cliente ha de estar esperando estos paquetes.

Si conoces la lógica de tu servidor, tienes que fabricar un cliente acorde con la lógica de tu servidor y que las acciones por ambas partes estén sincronizadas.

Quizás, si detallas un poco más la lógica de tu servidor y qué planteas para el cliente, pueda decirte algo más concreto.

Un saludo.
Responder Con Cita
  #5  
Antiguo 28-04-2010
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
Hola. El protocolo con el servidor es sencillo. Sólo unos cuantos tipos de envíos del cliente al servidor con su correponsdiente ACK por parte del servidor.
El problema es cuando el servidor decide iniciar el envío de datos al cliente sin petición previa de esté.
Una solución podría ser como dices poner el cliente en lectura, y esta es en sí la cuestión de la pregunta. ¿Como pongo al cliente en lectura? Pues el idTCPServer tiene un evento OnExcute que se dispara al recibir datos, pero en el idTCPClient no hay.
Ahora mismo, resumiendo, se me ocurren dos posibilidades:
- Temporizador que cada cierto tiempo (milisegundos) compruebe si hay datos, y si los hay los procese.
- idConnectionIntercep evento OnReceive, que captura las tramas antes del IdTCPClient por lo que podría analizar la cabecera y determinar si el tipo de paquete es respuesta a un comando del cliente o se trata de una comunicación de comando por parte del servidor.

Afortunadamente el protocolo es bastante sencillo y son pocos tipos de tramas los que se envían entre cliente y servidor.
Pero en caso de un sistema de comunicaciones más complejo, no veo la opción a establecer una conexión TCP totalmente bidireccional en igualdad de rangos, es decir, ambos extremos de la conexión actúan como clientes o como servidores según necesiten.
Un saludo
Responder Con Cita
  #6  
Antiguo 29-04-2010
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 21
sur-se Va por buen camino
Hola. Después de varias pruebas, con el componente idConnectionIntercept no se puede hacer ya que este componente no dispara el evento OnReceive a menos que el idTCPCliente haga un Read. Por tanto esa solución descartada.
La otra opción, con el temporizador parece que si funciona bien. Seguí investigando un poco más sobre como hacerlo y encontré que en la demo que trae de Chat hace eso exactamente, ya que el servidor de chat debe propagar los mensajes escritos por los usuario hacia el resto de los clientes, y el mecanismo que utiliza es el de un temporizador cada medio segundo para comprobar si hay alguna información recibida.
Así funciona aparentemente bien, y desde el servidor se pueden enviar mensajes a los clientes.
Lo pongo aquí por si le puede servir a alguien en el futuro.
Un saludo.
Responder Con Cita
  #7  
Antiguo 27-12-2010
angelito_0303 angelito_0303 is offline
Registrado
NULL
 
Registrado: dic 2010
Posts: 1
Poder: 0
angelito_0303 Va por buen camino
Ayudaaa

Hola estoy intentado desarrollar algo parecido a lo que decis.
El cliente que se conecte al servidor (TCP/IP) debe enviar una trama de login, a la que el servidor debe responder ok si va bien y sino le pide que se registre.
El servidor debe responder en consecuencia de lo k haga el cliente. (mensaje alta, mensaje baja y poder guardar en un fichero log).
Estoy bastante perdido en el tema, me podeis ayudar o pasarme el codigo vuestro??? muchas gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
conexion web Zehcliv Internet 0 17-10-2008 11:35:59
conexion ip armando Conexión con bases de datos 3 15-07-2007 02:56:31
Conexión TCP A Fox lpedrazzi Providers 0 27-02-2007 15:43:40
Conexión ADO scooterjgm Conexión con bases de datos 2 03-04-2006 17:13:21
Conexion con C++ trex2000 Conexión con bases de datos 1 16-03-2004 06:48:00


La franja horaria es GMT +2. Ahora son las 13:52:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi