Pergunta

Eu tenho um classic cliente/servidor (fat cliente e banco de dados) é um programa escrito em Delphi 2006.Quando certas condições são satisfeitas no cliente, eu preciso notificar todos os outros clientes muito rapidamente.Até agora isso tem sido feito usando UDP transmissões, mas isso não é mais viável, como clientes, agora que se conectar a rede local e a difusão UDP é limitado a uma rede local.

Eu estou ciente da Indy bibliotecas, mas não tenho certeza de quais componentes usar e como estrutura de ti.Eu estou supondo que eu vou precisar ter um servidor que os clientes ligam para o que vai receber e distribuir as mensagens de...?Todas as amostras de lá fora para me começar?

Existem outros componentes ou conjuntos de tecnologias do eu, deve olhar, em vez disso,/como assim?

Foi útil?

Solução

A resposta simples é que o padrão de protocolos disponíveis em Delphi (e outras ferramentas) não permitir a notificação no sentido inverso.Eu olhei para este um projeto que eu queria usar SABÃO.Todos eles pressupõem cliente pede, o servidor responde e é isso.

Para mim, a solução foi o RemObjects SDK.Isto permite-lhe enviar notificações para os clientes, e a notificação pode ter todos os dados que você gosta (assim como o de cliente para servidor).Eu mesmo uso o SuperTCP ligação, mas ele funciona com os outros também.Ele pode, ainda, oferecer uma interface SOAP para clientes que precisam usá-lo, mas para onde você tem o controle de cliente e de servidor que funciona extremamente bem.

Outras dicas

Há alguns muito fácil maneiras de fazer isso com o Delphi, embora eu tenho certeza que o RemObjects SDK funciona muito bem também.

  1. Ter um servidor central que tem um * TIdTCPServer ouvir* sobre ele.Em seguida, cada cliente tem um TIdTCPClient sobre ele.Eles se conectar ao servidor e bloco em uma leitura em espera para o servidor para escrever.Uma vez que o servidor recebe uma notificação através de um socket de escuta-lo transmissões para cada um dos clientes esperando.Isso é muito bonito notificação imediata de todos os clientes.
  2. Ter um servidor central que tem uma TIdTCPServer listening em ele.Em seguida, cada cliente tem um TIdTCPClient sobre ele.Os clientes podem "ping" o servidor solicite atualizações em um intervalo regular (use um token de sessão para manter o estado).A frequência do intervalo determina o quão rápido a notificação será.Quando uma vez que uma das necessidades de seus clientes para notificar os outros, ele apenas notifica o servidor.Em seguida, o servidor utiliza um fila de mensagens para fazer uma lista de todas as sessões do cliente e adiciona uma notificação para cada um.Então da próxima vez que cada um dos clientes se conecta dá-lo a notificação e remover da fila.
  3. Manter um tabela de sessão no banco de dados, onde cada cliente de atualizações regularmente que eles têm uma sessão ativa, e retira-se quando desliga.Você vai precisar de um processo de manutenção que remove sessões de inatividade.Em seguida, você tem um mensagem da fila de tabela que um cliente pode gravar uma atualização para com uma linha para cada sessão ativa.Em seguida, os outros clientes regularmente pode ping essa tabela para ver se há quaisquer notificações pendentes para a sua sessão, se houver, pode ler-los, agir sobre eles e, em seguida, removê-los.
  4. Algum tipo de ponto a ponto abordagem foram os clientes estão cientes um do outro, através de informações no banco de dados e, em seguida, eles se conectam diretamente uns aos outros e notificar ou pedir para as notificações (dependendo de firewall e as configurações NAT).Um pouco mais complexo, mas possível.

Obviamente, a escolha de implementação vai depender de sua configuração e necessidades.Tunning serão necessários para alcançar os melhores resultados.

Os componentes que você precisa para isso são os TIdTCPServer (ouvinte) e TIdTCPClient (remetente).Ambos estão na Indy bibliotecas em Delphi.

ICS componentes de http://www.overbyte.be são ótimos.a.) Melhor compatibilidade de Indy b.) Cartão postal ware Bons exemplos e suporte.Use TClientSocket e TServerSocket

FirebirdSQL projeto utiliza o conceito de notificações como sendo server-conexões de cliente que envia uma seqüência de caracteres para o cliente.Para isso, o servidor de banco de dados usa uma outra porta.E exigir que o cliente registre, é interessante receber um determinado tipo de notificação por meio de uma chamada de API.

Você pode usar a mesma idéia.

RabbitMQ deve caber a conta.O servidor está livre e pronto para usar.Você precisa apenas de um lado do cliente para se conectar, a emissão/envio de mensagem e obter/puxar notificado mensagem

Servidor: http://www.rabbitmq.com/download.html Fazer um google para o cliente ou a implementar-se

Cheers

Você deve ser capaz de utilizar Multicast UDP para a mesma finalidade.A única diferença será juntar-se ao grupo multicast a partir de cada cliente.

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

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

Editar: Só para esclarecer, multicast permitem que você participar de um determinado "grupo" associado a um endereço ip de multicast.Qualquer pacote enviado para esse endereço vai chegar a cada cliente que aderir a grupo

Você pode assistir weonlydo wodVPN de componentes que permitem que você criar um robusto UDP hole punching e ganhar um porta-forwading ou normal VPN (com um fornished adaptador de rede), então você pode conectar dois pcs atrás de um NAT.

Eu estou usando esse controle para o nosso programa de comunicação e funciona muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top