Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Protocolo envío de ficheros entre pcs (https://www.clubdelphi.com/foros/showthread.php?t=31779)

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;



La franja horaria es GMT +2. Ahora son las 18:16:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi