Ver Mensaje Individual
  #18  
Antiguo 26-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Reputación: 0
Status Quo Va por buen camino
Código

Hola Seoane.

Esto no está montado en mi aplicación porque me daba tantos poblemas que lo hice aparte. Está basado en uno que recomendaban en el club en una determinada página (no recuerdo cual). Voy a mirar lo que me has mandado y voy a tratar de montarlo todo en mi apliación, porque aquí por ejemplo mando los ficheros eligiendo el que quiero y en mi aplicación debo hacer que cada cierto tiempo mire a ver cuales han sido modificados, creados o borrados y los envíe al cliente. Una sincroniación de ficheros, todo lo que haga en el servidor debe hacerse en el cliente.

En lo que te mando tengo dos socket, uno dedicado a mandar el tamaño del fichero (servidor -> cliente) a enviar y otro que envía el fichero (cliente ->servidor). Lo he hecho así por los problemas que me daba el meter la información en los fragmentos del fichero, pero ahora viendo que funciona lo que me estás aconsejando, voy a unificarlo todo y a emplear sólo un socket (que es cómo me han pedido que lo haga).


El código para enviar ficheros es:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
stream:TStream;

P: Paquete;

begin
   if ServerSocket1.Active = True then
   begin
      OpenDialog1.Filter := 'All Files (*.*)';
      OpenDialog1.FilterIndex := 1;
      if OpenDialog1.Execute then
      begin
         Edit1.Text := ExtractFileName(OpenDialog1.FileName); //He puesto un boton y un Dialog  para escojer el fichero

         ServerSocket1.Socket.Connections[0].SendText('FILE!'+Edit1.Text);
         sleep(2000);
         Streamsize := TFileStream.Create(OpenDialog1.FileName, fmopenread);
         Sleep(2000);
         ServerSocket1.Socket.Connections[0].SendText('SIZE!'+Edit2.Text);
         Streamsize.Position := 0;
         Streamsize.Free;
         sleep(2000);

         ClientSocket2.Address := Edit3.Text;
         ClientSocket2.Open; // Preparado para enviar el fichero en el segundo socket

         stream:=TFileStream.Create(OpenDialog1.FileName, fmopenRead);
         P.Tamano:=stream.Read(P.Buffer,SizeOf(P.Buffer));

        repeat
            Application.ProcessMessages;

            P.Tipo:= 1;
            ClientSocket2.Socket.SendBuf(P,sizeof(P)-1);
            P.Tamano:= stream.Read(P.Buffer,SizeOf(P.Buffer));

        until(P.Tamano=0);
        stream.Free;

      end;
   end
     else
     MessageDlg('Error de conexión', mtError, [MbOK],0);
end;



El código para recibir el fichero enviado es:


Código Delphi [-]
procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  // Este segundo socket es el que se encarga de la recepción de los ficheros

var
    IncommingLen, RecievedLen: integer;
    Filepath: string;

    P: Paquete;
begin
   Timer1.Enabled := True;
   IncommingLen := socket.ReceiveLength;
   Filepath := ExtractFilePath(Edit1.Text)+Edit1.Text;



    while IncommingLen > 0 do
    // Asegurar que el proceso termina
    begin

       RecievedLen := Socket.ReceiveBuf(P, Sizeof(P));

    if RecievedLen <= 0 then
    begin
           Break
       end
    else

      IncommingStream.Write(P.Buffer, P.Tamano);

      ProgressBar1.StepBy(RecievedLen);

     if IncommingStream.Size >= strtoint(Edit2.Text) then
       begin

       IncommingStream.Free;
       memo1.Lines.Add('File '+Edit1.Text +' Recieved Successfuly');
       memo1.Lines.Add('Time Taken to Recieve File ' +IntToStr(TimeTaken)+' seconds');
       ClientSocket1.Socket.SendText('DONE!');
       Edit1.Text := '';

       Edit2.Text := '';
       ProgressBar1.Position := 0;
       Timer1.Enabled := False;
       TimeTaken := 0;
       if Messagedlg('Would you Like to open the recieved file?', mtConfirmation, [MbYes,MbNo],0) = MrYes then  
       begin
         ShellExecute(Form1.Handle, 'open', pchar(Filepath),nil, nil, SW_NORMAL); 
       end;
       Break;                                                                         
    end;
   end;
  end;

Voy a ponerme a currar como un loco y voy a mirarme bien lo que me has mandado.
El código que he puesto a lo mejor está un poco caótico...bueno..voy a ir trabajando y luego te cuento.
Responder Con Cita