2010-08-07 10 views
5

Tengo una aplicación Cliente/Servidor escrita en Delphi. Básicamente, lo único que hace la aplicación es transferir flujos de datos xml entre una aplicación de servidor y clientes conectados. Actualmente estoy usando el componente Indy TIdTCPServer. Pero la aplicación del lado del servidor sigue fallando en algunas de mis entregas. Y ha sido extremadamente difícil de depurar. Así que me pregunto si hay alguna "arquitectura" que debería estar utilizando, que haga toda la gestión de conexiones tcp/ip y la agrupación de conexiones de bases de datos, lo que me permite concentrarme en la lógica comercial.¿Qué tecnología Delphi usar?

Aquí hay más detalles:

  • los clientes deben mantener una conexión "persistente". Hay ocasiones en que el servidor debe notificar y enviar datos a todos los clientes conectados.
  • clientes se están conectando desde computadoras portátiles usando tarjetas de aire inalámbricas. Entonces, las "caídas" de red son bastante comunes.
  • Base de datos del servidor es SqlServer.
  • Puede haber más de 100 computadoras conectadas simultáneamente a la vez. Cuando el servidor obtiene una nueva conexión (TCPServer.OnConnect) instanciando mi propio objeto que contiene su propia conexión de base de datos SqlServer. Cuando se eliminan las conexiones tcp, a su vez, libero estos objetos (y la conexión de base de datos asociada).
  • La aplicación cliente tiene un TTimer incorporado. Ellos rutinariamente envían latidos al servidor. Y si "sueltan"/"pierden" su conexión, automáticamente establecen una nueva conexión una vez que la red está de vuelta.

¿Alguien tiene alguna sugerencia sobre la mejor aproximación/arquitectura aquí?
Supongo que el componente Indy funcionaría, pero al mismo tiempo siento que estoy "reinventando la rueda" con respecto a la gestión de las conexiones.

conjuntos
+1

Alinear sus propios medios dedicando un porcentaje de tiempo a mantener su propio marco. Para ampliar su efectividad en Delphi, su idea de que tal vez debería evaluar las tecnologías/conjuntos de herramientas comerciales/componentes compatibles que ya están construidos y son compatibles, es excelente. Por supuesto, las herramientas de código abierto también podrían ser buenas. Pero si su tiempo es más escaso que su dinero, vaya con las soluciones comerciales. –

+0

Absolutamente, exactamente a lo que me refiero. Solo quiero una arquitectura probada de C/S "3 niveles" que funcione. –

Respuesta

6

tres componentes soy consciente de que se hará cargo de lo esencial y aspectos técnicos arenoso de aplicaciones cliente-servidor para usted:

Es posible que tenga que volver a trabajar sus aplicaciones para aprovechar la forma en que funcionan estos conjuntos de componentes, pero suponiendo que tiene capas separadas adecuadamente que no deberían ser demasiado complicadas y le comprará la ventaja de un código bien probado y ampliamente utilizado para el trabajo de su servidor cliente.

+1

+1. He evaluado RemObjects y kbmMW y son EXCELENTES. No he evaluado Asta pero parece prometedor. –

+3

Asta probablemente no sea la mejor opción, ya que no se desarrolla activamente más. –

+0

@ dmauric.mp: gracias, no lo sabía. Mirando el sitio otra vez parece bastante obsoleto: mencionar Asta 3.0 con soporte para Delphi hasta la versión 7 y una página principal la última actualización 28 de enero de 2006 ... –

1

Si desea algunos componentes ligeros de TCP/IP, eche un vistazo a nuestra unidad SynCrtSock.

Encontrará clases de bajo nivel para crear clientes y servidores IP. Implementamos TCP/IP y UDP/IP en una de nuestras aplicaciones.

También hay una clase THttpServer, que implementa un servidor HTTP/1.1. Por lo tanto, sigue la gestión de conexión HTTP/1.1. También hay una compresión opcional, y usar HTTP/1.1 en un puerto que no sea 80 no es una mala idea. Y lo que está bien con HTTP/1.1 es que puede pasar a través de firewalls, y puede ser fácilmente VPNed o alojado en otro servidor HTTP (como IIS o Apache) con un proxy. Incluso hay una clase FastCGI, si necesita dicho servidor en una solución basada en Linux. Por supuesto, una clase THttpClientSocket hace lo mismo en la clase de cliente.

Utilizamos estas clases para agregar la conexión HTTP/1.1 a nuestro marco REST Open Source SQLite3 - http://synopse.info/forum/viewforum.php?id=2

Ver http://synopse.info/fossil/artifact?name=722e896e3d7aad1fe217b0e2e7903483e66d66d1 para la unidad SynCrtSock. Código abierto, trabajo de Delphi 7 a Delphi 2010.

+0

¿HTTP asume automáticamente "sin estado" en el sentido en que el cliente realiza la conexión y la solicitud, el servidor responde con datos y el cliente se desconecta? Esta aplicación particular necesita mantener una conexión persistente. –

+0

HTTP/1.1 define una conexión persistente. En nuestra implementación, establecemos una propiedad "KeepAliveMS" (lado del cliente) para mantener la conexión durante el valor especificado de los milisegundos suministrados. Es apátrida desde el punto de vista del servidor, pero la conexión no está rota. Con tales conexiones persistentes, he visto mejoras de velocidad x10 hasta x40 en Windows. Puede usar cookies para proporcionar una función de sesión. Pero como queríamos implementar un marco RESTful, no utilizamos cookies, sino un marco sin estado puro. –

1

Misha Charrett's CSI Application Framework cubre prácticamente todo lo que usted está pidiendo.

Es un marco de código abierto Delphi que en esencia es un marco de paso y enrutamiento de mensajes distribuidos que permite el paso de mensajes XML desde el cliente al servidor y del servidor al cliente.

Puede manejar desconexiones/reconexiones, altos números de clientes y hay una biblioteca de base de datos virtual opcional que manejará el servidor SQL (o podría usar el mismo acceso al SQL Server que está utilizando ahora).

Aún no es muy conocido pero puedo decir que se ha desarrollado activamente en los últimos años y que el autor Misha está muy interesado en ayudar a cualquiera que esté interesado en usarlo en su aplicación.

+0

Gracias - Lo verificaré. –

0

Si usa Indy, cada conexión tendrá el mismo hilo.

De todos modos, sugiero para la conexión a MSSQL usar SDAC de Devart http://www.devart.com/sdac/ y para la capa de conexión para utilizar HPScktSrvr basado en puerto E/S Finalización de http://www.torry.net/authorsmore.php?id=7131 (no sé qué cambios aunque será necesario para los cambios TThread en VCL más nuevo). Construye su clase de cliente alrededor de THPServerClient, configura su nueva clase como el servidor ClientClass y el marco creará automáticamente nuevos clientes para usted.

0

También es posible que desee echar un vistazo a la ICS/Midware combinado: http://www.overbyte.be/

+0

Tendré que mirar hacia atrás en ICS. De hecho, tengo este componente. Pero hasta donde sabía, era un componente "TCP/IP" que esencialmente hace lo que hace Indy/IpWorks. Lo que estoy buscando en última instancia es un componente que haga la gestión de la conexión y la agrupación de la base de datos, todo en uno. –

+1

ICS es el equivalente de Indy. Midware es un producto diferente para aplicaciones de varios niveles que usa ICS como capa de comunicación. Son dos productos separados de la misma persona. :-) –

1

Bueno, probablemente requeriría una reescritura completa de la mayor parte de su código C/S, pero en lugar de utilizar los componentes Indy, podrías intentar usar una solución COM + en su lugar. Básicamente, crearía un componente COM + que se instalará en el servidor y sus aplicaciones cliente se conectarán a este cliente y llamarán directamente a las funciones de este componente. Tendrá administración de transacciones que será manejada por Windows mismo y lo mismo se aplica al manejo de transacciones. También es técnicamente posible crear eventos, lo que permitiría al servidor hacer devoluciones de llamada al cliente, aunque eso haría las cosas un poco más complicadas.
No creo que esta solución funcione para usted, a menos que tenga mucha experiencia con el desarrollo de COM en Windows y/o tenga la valentía de probar algo diferente.
En el pasado, tuve un problema similar en el que cientos de clientes tenían que conectarse a un único servidor, realizando todo tipo de transacciones de base de datos. Tiene una gran curva de aprendizaje, pero mi equipo y yo logramos que todo funcione y, una vez que entendimos la técnica, resultó en una solución muy estable y confiable que logró tener hasta 500 usuarios simultáneamente realizando actualizaciones y otras acciones en una sola. -tiempo extrema prueba de estrés. Pero, una vez más, la maldición del aprendizaje es abrupta, por lo que podría no ser la solución que estás buscando.
(Aun así, COM + utilizará muchas funciones integradas en Windows, como gestión de transacciones, agrupación de bases de datos y demás).

+1

Muchas gracias por la respuesta detallada. De hecho, no tengo experiencia COM. Mi experiencia se limita a componentes Delphi y herramientas de terceros. –

+0

Bueno, entonces olvida lo que dije aquí. COM (y COM +) tiene una alta curva de aprendizaje al principio. Pero una vez que comprenda la técnica, puede ser realmente útil, permitiéndole usar la funcionalidad estándar de Windows sin la necesidad de componentes de terceros. –

Cuestiones relacionadas