Onde mesmo esta instalado o servidor Datasnap…. gostaria de descobrir a configuração do servidor:  local (ip) onde (porta) como (path)…

Olhando como o Indy-10 trabalha – não é tão intuitivo em se tratando de broadcast – então é preciso trabalhar um pouco.

Utilizar   TIdUDPServer – No Indy-10 o TIdUDPClient não obtive sucesso em pegar o retorno com broadcast… isto mudou o rumo da implementação – passei a pensar em montar DOIS servidores diferentes, um para o Servidor – outro para o Cliente.

Ver Código da Classe:  TIdZeroConfServer     e    TIdZeroConfClient

Projetos exemplos para Servidor e Cliente

Implementação

  1. No servidor datasnap preparar para receber o pedido do cliente solicitando os dados de configuração do servidor.

    [code lang=”pascal”]

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FServer := TIdHTTPWebBrokerBridge.Create(Self);
    // criar o servidor zeroConf
    // ———————————————————————-
    FZeroConf := TIdZeroConfServer.create(self);
    end;

    procedure TForm1.ButtonStopClick(Sender: TObject);
    begin
    TerminateThreads;
    FServer.Active := False;
    FServer.Bindings.Clear;
    // parar o servidor broadcast
    // ———————————————————————-
    FZeroConf.active := false;
    end;

    procedure TForm1.StartServer;
    begin
    if not FServer.Active then
    begin
    FServer.Bindings.Clear;
    FServer.DefaultPort := StrToInt(EditPort.Text);
    FServer.Active := True;
    // configura o ZeroConf
    // ——————————————————————–
    FZeroConf.active := false;
    FZeroConf.AppDefaultPort := FServer.DefaultPort; // Porta do servidor Datasnap
    FZeroConf.AppDefaultHost := FZeroConf.LocalHost; // IP de onde se encontra o Servidor da Aplicação Datasnap
    FZeroConf.AppDefaultPath :=’/’; // path base do servidor
    FZeroConf.active := true; // ativar o servidors
    end;
    end;

    [/code]

  2. Implementar no cliente Datasnap:

    [code lang=”pascal”]
    procedure TForm4.FormCreate(Sender: TObject);
    begin

    // incia o cliente
    // ————————————————-
    FZeroConfClient := TIdZeroConfClient.create(self);
    FZeroConfClient.OnResponseEvent := DoReceberDados;

    end;

    procedure TForm4.Button1Click(Sender: TObject);
    begin
    if not FZeroConfClient.active then
    FZeroConfClient.active := true;
    Memo1.Lines.Add(‘Envia comando de procurar servidor (‘+FormatdateTime(‘hh:mm:ss’,now)+’)’);
    FZeroConfClient.BroadcastIP := ”;//’192.168.56.1′;
    FZeroConfClient.Send;
    end;

    procedure TForm4.DoReceberDados(Sender: TObject; AMessage: String);
    begin
    // AMessage – retorna o JSON com os dados do servidor
    Memo1.Lines.Add(‘Resposta(‘+FormatdateTime(‘hh:mm:ss’,now)+’):’+AMessage);
    Memo1.Lines.Add(”);
    FZeroConfClient.Active := false; // desliga
    end;

    [/code]

 

Como funciona a mecânica

Quando iniciar o servidor  TIdZeroConfServer, ele criar um servidor UDP que fica esperando um broadcast na porta 53330 (configurável) ao ativar o ZeroConf passar os parametros do servidor Datasnap que será utilizado para responder as solitações dos clientes;

Do lado do cliente, ao ativar o TidZeroConfClient, ele criar uma escuta na porta 53331 e envia (send) comando solicitando configuração do servidor… recebe a resposta no evento – DoReceberDados(…);

Formato da Resposta

A reposta é um JSON:   {“service”:”ZeroConf”,”command”:”response”,”payload”:”yyyy-dd-mm hh:mm:ss”,”source”:”ip do servidor”,”host”;”ip onde o datasnap esta respondendo”,”port”:”porta do datasnap”,”path”:”caminho http”}

 

Cuidados/Limitações

Alguns firewall tendem a bloquear mensagem de broadcast, já que não é visto com bons olhos pelos gerenciadores de rede.

Usando broadcast por UDP, o pacote circula somente na rede local – não saindo para outras redes.

Multiplos aplicativos tentando utilizar a mesma porta… alterar para utilizar portas diferentes para aplicativos diferentes – provavelmente será necessário tratar as exceções para os casos de tentativa de abrir portas que  estão em uso.