Pregunta

Tengo un programa clásico cliente/servidor (cliente pesado y base de datos) escrito en Delphi 2006.Cuando se cumplen ciertas condiciones en el cliente, debo notificar a todos los demás clientes muy rápidamente.Hasta ahora, esto se ha hecho mediante transmisiones UDP, pero ya no es viable ya que los clientes ahora se conectan desde fuera de la LAN y la transmisión UDP se limita a la red local.

Conozco las bibliotecas de Indy, pero no estoy realmente seguro de qué componentes usar y cómo estructurarlos.Supongo que necesitaré tener un servidor al que se conecten los clientes y que reciba y distribuya los mensajes...¿Alguna muestra para ayudarme a empezar?

¿Hay otros conjuntos de componentes o tecnologías que debería considerar en su lugar o también?

¿Fue útil?

Solución

La respuesta simple es que los protocolos estándar disponibles en Delphi (y otras herramientas) no permiten la notificación a la inversa.Busqué esto para un proyecto en el que quería usar SOAP.Todos asumen que el cliente pregunta al servidor, el servidor responde y eso es todo.

Para mí, la solución fue el SDK de RemObjects.Esto le permite enviar notificaciones a los clientes, y la notificación puede tener cualquier dato que desee (al igual que el cliente al servidor).Yo uso la conexión SuperTCP, pero también funciona con otros.Todavía puede ofrecer una interfaz SOAP para los clientes que deben usarla, pero cuando tienes control tanto del cliente como del servidor, funciona extremadamente bien.

Otros consejos

Hay algunas formas realmente sencillas de hacer esto con Delphi, aunque estoy seguro de que el SDK de RemObjects también funciona muy bien.

  1. Tener un servidor central que tenga un *TIdTCPServer escuchando*.Entonces cada cliente tiene un Cliente TIdTCPC en eso.Se conectan al servidor y bloquear en una lectura espera Para el servidor para escribir.Una vez que el servidor recibe una notificación a través de un conector de escucha, transmisiones a cada uno de los clientes en espera.Esta es una notificación prácticamente inmediata a todos los clientes.
  2. Contar con un servidor central que tenga un TIdTCPServer escuchandog en ello.Entonces cada cliente tiene un Cliente TIdTCPC en eso.Esos clientes pueden "silbido" el servidor solicite actualizaciones a intervalos regulares (use un token de sesión para mantener el estado).La frecuencia del intervalo determina qué tan rápida será la notificación.Cuando uno de los clientes necesita notificar a los demás, simplemente notifica al servidor.Luego, el servidor utiliza un cola de mensajes para hacer una lista de todas las sesiones de clientes activas y agrega una notificación para cada una.Luego, la próxima vez que cada uno de los clientes se conecte, le dará la notificación y lo eliminará de la cola.
  3. Mantener un mesa de sesiones en la base de datos donde cada cliente actualiza periódicamente que tiene una sesión activa y se elimina cuando se desconecta.Necesitará un proceso de mantenimiento que elimine las sesiones muertas.Entonces tienes un tabla de cola de mensajes en el que un cliente puede escribir una actualización con una fila para cada sesión activa actual.Luego, los otros clientes pueden hacer ping periódicamente a esa tabla para ver si hay notificaciones pendientes para su sesión; si las hay, puede leerlas, actuar en consecuencia y luego eliminarlas.
  4. Alguna clase de de igual a igual enfoque en el que los clientes se conocen entre sí a través de la información de la base de datos y luego se conectan directamente entre sí y notifican o solicitan notificaciones (dependiendo de las configuraciones del firewall y NAT).Un poco más complejo, pero posible.

Obviamente, la elección de la implementación dependerá de su configuración y necesidades.Será necesario realizar ajustes para lograr los mejores resultados.

Los componentes que necesitas para esto son los TIdTCPServidor (oyente) y Cliente TIdTCPC (remitente).Ambos se encuentran en las bibliotecas de Indy en Delphi.

Componentes ICS de http://www.overbyte.be son geniales.a.) Mejor compatibilidad que Indy b.) Postal Ware buenos ejemplos y apoyo.Utilice TClientSocket y TServerSocket

El proyecto FirebirdSQL utiliza el concepto de notificaciones como conexiones servidor-cliente que envían una cadena al cliente.Para ello, el servidor de base de datos utiliza otro puerto.Y exigir que el cliente se registre es interesante recibir un determinado tipo de notificación a través de una llamada API.

Podrías usar la misma idea.

RabbitMQ debería ajustarse a sus necesidades.El servidor es gratuito y está listo para usar.Solo necesita un lado del cliente para conectarse, enviar/enviar mensajes y recibir/extraer mensajes notificados

Servidor: http://www.rabbitmq.com/download.htmlHaga un google para el cliente o impleméntelo usted mismo

Salud

Debería poder utilizar Multicast UDP para el mismo propósito.La única diferencia será unirse al grupo de multidifusión desde cada cliente.

http://en.wikipedia.org/wiki/IP_Multicast

http://en.wikipedia.org/wiki/Internet_Group_Management_Protocol

Editar: Solo para aclarar, la multidifusión le permite unirse a un "grupo" determinado asociado a una dirección IP de multidifusión.Cualquier paquete enviado a esa dirección llegará a todos los clientes que se hayan unido al grupo.

Puede ver el componente weonlydo wodVPN que le permite crear una perforación UDP robusta y obtener un reenvío de puertos o una VPN normal (con un adaptador de red proporcionado) para que pueda conectar dos PC detrás de un NAT.

Estoy usando este control para nuestro programa de comunicación y funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top