Ver Mensaje Individual
  #1  
Antiguo 17-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Reputación: 0
Status Quo Va por buen camino
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;
Responder Con Cita