Status Quo |
17-05-2006 19:58:20 |
Protocolo envío de ficheros entre pcs
Hola de nuevo…
Me está agobiando la realización del programa.
Tengo que sincrozar los directorios que hay en un directorio de un servidor con los que hay en un cliente.
Para ello tengo que mandar (a trozos) los ficheros al cliente mediante un protocolo inventado por mi…
Al final he conseguido hacer esto…que…no hace una m…
No he descubierto como mandar al cliente los tozos de bytes con cabecera incluida…así que lo que hago es envíar un texto con la cabecera antes de eviar cada trozo…
El caso esque siempre me da error al volver a leer un trozo…del fichero en el servidor.
Comentando lo que está en negrita, consigo que no de error en el servidor. Pero si me lo da en el cliente (en negrita ) al intentar crear el fichero…
Me estoy deserperando. Por favor si no os importa echarle un vistazo al enjendro que he hecho y orientarme un poco.
Gracias
Función que manda ficheros al cliente:
Código:
procedure TForm1.ActualizarCliente(nombreFichero:string);
var
stream: TStream;
leidos: Cardinal;
trama:TMemoryStream;
buf:pchar;
nombFich:string;
buffer:array[0..256] of byte;
msjFICH:String;
msjTRAMA:String;
i:integer;
PCliente:TPuntero;
numFragm:integer;
tam:integer;
tipo: char;
begin
stream:=TFileStream.Create('Maestro\'+ nombreFichero,fmOpenRead);
tam :=(stream.Size);
leidos:=stream.Read(buffer,SizeOf(buffer));
ShowMessage('Pasa por las asig');
tipo:='f';
for i:=0 to MiLista.Count-1 do{Se recorren los clientes almacenados en la lista}
begin
ShowMessage('Pasa por el for');
PCliente:=MiLista.Items[i];
msjFICH:=tipo+ formatFloat('0000',tam)+ formatFloat('00',length(nombreFichero))+ nombreFichero;
PCliente^.Conexion.SendText(formatFloat('000',length(msjFICH)+3)+msjFICH);
end;
tipo:='t';
repeat
Application.ProcessMessages;
trama:=TMemoryStream.Create;
trama.WriteBuffer(buffer,leidos);
ShowMessage('Pasa por el repeat');
for i:=0 to MiLista.Count-1 do{Se recorren los clientes almacenados en la lista}
begin
PCliente:=MiLista.Items[i];
msjTRAMA:=(tipo+ formatFloat('000',numFragm)+formatFloat('000',leidos));
PCliente^.Conexion.SendText(formatFloat('000',length(msjTRAMA)+3)+msjTRAMA);
ShowMessage('Pasa por el sendtext');
PCliente^.Conexion.SendStream(trama);
ShowMessage('Pasa por el sendstream');
end;
leidos:=stream.Read(buffer,SizeOf(buffer));//me da error
ShowMessage('Pasa por leidos');
trama.Position:=0;
trama.Free; until(leidos=0);
stream.Position:=0;
stream.Free;
end;
Cliente que recibe los ficheros del servidor
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
//longCab:integer;
MsjLocal:String;
tipo:char;
NombFich:String;
tamMsj:integer;
tamFich:integer;
tamNombreFich:integer;
numFrag:integer;
FragLeidos:integer;
TamEntrante:Integer;
TamRecibido:Integer;
buffer:array[0..9999] of byte;
FicheroStream: TFileStream;
begin
ColaMsj:=ColaMsj+Socket.ReceiveText;
while (length(ColaMsj)>=7) do//Para cojer tamaño mensaje y tipo
begin
memo1.Lines.Add('cola '+ColaMsj);
tamMsj:=StrToInt(copy(ColaMsj,1,3));
memo1.Lines.Add('tam: '+IntToStr(tamMsj));
tipo:=ColaMsj[4];
memo1.Lines.Add('tipo'+tipo);
if (length(ColaMsj)>=tamMsj) then
begin
if tipo = 'f' then
begin
tamFich:=StrToInt(Copy(ColaMsj,5,4));
memo1.Lines.Add('tamfich: '+IntToStr(tamFich));
tamNombreFich:=StrToInt(Copy(ColaMsj,9,2));
memo1.Lines.Add('tamnombrefich: '+IntToStr(tamNombreFich));
NombFich:=Copy(ColaMsj,11,tamNombreFich);
memo1.Lines.Add('Nombrefich: '+NombFich );
msjLocal:=Copy(ColaMsj,1,tamMsj); // Cogemos el primer mensaje de la cola de mensajes
delete(ColaMsj,1,tamMsj); // quitamos el primer mensaje de la cola
end
else//Mensaje de trama
begin
numFrag:=StrToInt(Copy(ColaMsj,5,3));
FragLeidos:=StrToInt(Copy(ColaMsj,8,3));
msjLocal:=Copy(ColaMsj,1,tamMsj); // Cogemos el primer mensaje de la cola de mensajes
delete(ColaMsj,1,tamMsj); // quitamos el primer mensaje de la cola
end;
end;
Sleep(1);
FicheroStream := TFileStream.Create(NombFich, fmCREATE or fmOPENWRITE and fmsharedenywrite);
TamEntrante:= Socket.ReceiveLength;
while TamEntrante > 0 do
begin
TamRecibido:=Socket.ReceiveBuf(buffer,Sizeof(buffer));
if TamRecibido > 0 then
begin
FicheroStream.Write(buffer,tamRecibido);
end;
end;
end;
end;
|