Bueno Caral, espero que no me sometas a un tercer grado.... Vamos a ver los pasos que he seguido hasta ahora...
En el FormMain meto este componente
Código Delphi
[-]IdUDPServer: TIdUDPServer
BufferSize = 4028
BroadcastEnabled = True
Bindings = <>
DefaultPort = Tupuerto8080
OnUDPRead = IdUDPServerUDPRead
Left = 628
Top = 64
end
En el FormMain lo activo o no, dependiendo si es el caso, dado que como es el mismo programa para todas las máquinas, no todas han de actuar como servidores de esta informaón
Código Delphi
[-]
procedure TFormMain.FormShow(Sender: TObject);
begin
LoadOptions;
IdUDPServer.Active := Unit_Opciones.Servidor;
blablabla....
end;
Resultando que si ha sido el caso, esta máquina se pone como servidora UDP
y en el evento UDPRead, debemos atender las peticiones de los clientes...
Código Delphi
[-]
procedure TFormMain.IdUDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
str:string;
DataStringStream: TStringStream;
Mensaje:String;
begin
try
DataStringStream := TStringStream.Create('');
DataStringStream.CopyFrom(AData, AData.Size);
str:='';
str:=DataStringStream.DataString;
If Pos(FormMain.HostName,DataModule1.IBDatabase1.DatabaseName) <> 0 then
Mensaje := DataModule1.IBDatabase1.DatabaseName
else
Mensaje := HostName + ':' + DataModule1.IBDatabase1.DatabaseName;
if str='$Database_Path$' then
Abinding.SendTo(Abinding.PeerIp,Abinding.PeerPort,Mensaje[1],Length(Mensaje));
finally
DataStringStream.Free;
end;
end;
En este procedimiento lo que hago es primero obtener la ubicación de la base de datos con las comprobaciones pertinentes... con respecto a la base de datos y nombre de la máquina.
También pregunto "
if str='$Database_Path$' then" esto es la cadena que se espera del cliente que pide la información. Fijate que en este caso, se podrían controlar diversas cadenas y por supuesto devolver diversa información... Que era lo que comentaba
seoane.
Bueno pues si los pasos se cumplen, respondemos con el socket recibido en el evento...
Código Delphi
[-]Abinding.SendTo(Abinding.PeerIp,Abinding.PeerPort,Mensaje[1],Length(Mensaje));
y la fase servidor ya está terminada.
En este paso, ahora mismo, me surge la duda de como le envío el nombre de la máquina y el path completo de la BD, no se si este debe ir tal cual o con dobles barras
Ejp: "edu:d:\\data\\mybase.fdb"
Ahora vamos con el cliente.... El problema surgen porque no saben o no quieren configurar el path de la BD, que tal como dije antes, es configurable desde el módulo de configuración del programa y en este paso procedemos así:
En el Form de configuración introducimos un:
Código Delphi
[-]
IdUDPClient: TIdUDPClient
BufferSize = 4028
BroadcastEnabled = True
Port = Tupuerto8080
Left = 292
Top = 152
end
Especial importancia en la propiedad "
BroadcastEnabled = True" que era lo que comentaba
seoane, de este modo nos aseguramos que el mensaje se difunda por toda la red... (todavía no probado).
También el el form de configuración he puesto dos botones
"autoconfigurar" y "cancelar autonconfigurar".
cuando pulsamos auto configurar hacemos esto:
Código Delphi
[-]
procedure TFormConfig.ButtonAutoConfigClick(Sender: TObject);
Var cTemp : String;
begin
Autoconfig := True;
ButtonAutoConfig.Enabled := False;
ButtonCancelarAuto.Enabled := True;
IdUDPClient.Broadcast('$Database_Path$',Tupuerto8080);
cTemp := '';
while (cTemp = '') and Autoconfig DO
Begin
cTemp := IdUDPClient.ReceiveString(3);
Application.ProcessMessages;
End;
AutoConfig := False;
ButtonAutoConfig.Enabled := True;
Button1.Enabled := False;
if Trim(cTemp) <> '' then
Begin
FilenameEdit1.FileName := cTemp;
FilenameEdit1.Refresh;
ButtonTestClick(Sender);
End;
end;
Que lo que hace es difundir el mensaje "IdUDPClient.Broadcast('$Database_Path$',Tupuerto8080);" y esperar a recibir respuesta en el bucle... En el caso de no querer esperar, damos al botón CancelarAutoconfig, que es el que cambia el estado de la variable
Autoconfig y detiene el bucle.
En el caso de que hayamos recibido una respuesta, la procesamos asignando el valor que hemos recibido del "servidor" y ya de paso, hacemos un click en el botón que realiza un test de conexión, para verificar que el parámetro obtenido es el correcto.
También he montado un checkbox en el módulo config, para que exista al menos una máquina servidora y que también hace alguna verificación para evitar que haya más de una máquina como servidor...
Código Delphi
[-]
procedure TFormConfig.CheckBoxServidorClick(Sender: TObject);
begin
CheckBoxServidor.OnClick := NIL;
If Pos(FormMain.HostName,DataModule1.IBDatabase1.DatabaseName) <> 0 then
Begin
FormMain.Aviso('ESTE ORDENADOR NO PUEDE ESTABLECERSE COMO SERVIDOR' );
CheckBoxServidor.Checked := False;
End;
OptionsChange(Sender);
CheckBoxServidor.OnClick := CheckBoxServidorClick;
end;
Y esto es todo... de momento... lo he probado en local y aparentemente funciona. Mañana veré si pasa la prueba de fuego