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
- 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]
- 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.