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); 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;
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);
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
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.