Queria plantear otro problemita que me ha surgido: resulta que tengo 2 aplicaciones, una Server y otra cliente e intento enviar una imagen entre ambos. Para esto utilizo la suit "FUNDAMENTALS 3 - SOCKETS". Pues resulta que al enviar de cliente a Server no hay problema, el server recibe bien el archivo, pero al reves no lo he podido lograr y me he dado cuenta de una cosa: Cuando el Cliente envia los bloques con "WriteBuf", estos bloques no se envian hasta que acabo de escribirlos todos.
El codigo es el siguiente
Código Delphi
[-]procedure Enviarfichero ( fichero:string; Sender: ATCPClient );
var
Buffer: PByte;
Leidos: Integer;
begin
with TFileStream.Create(fichero,fmOpenRead or fmShareDenyWrite) do
try
GetMem(Buffer,BufferSize);
try
Leidos:= Read(Buffer^,BufferSize);
while (Leidos > 0) do
begin
Sender.Stream.WriteBuffer(Buffer^,Leidos);
Leidos:= Read(Buffer^,BufferSize);
end;
finally
FreeMem(Buffer);
end;
finally
Free;
end;
end;
y en el Server tengo:
Código Delphi
[-]procedure RecibirArchivo ( fichero:string; Sender: TTCPServerClient );
var
Buffer: PByte;
Recibidos: integer;
begin
with TFileStream.Create(fichero, fmCreate) do
try
GetMem(Buffer,BufferSize);
try
Recibidos:=Sender.Stream.Read(Buffer^,BufferSize);
while Recibidos > 0 do
begin
WriteBuffer(Buffer^,Recibidos);
Recibidos:=Sender.Stream.Read(Buffer^,BufferSize);
end;
finally
FreeMem(Buffer);
end;
finally
Free;
end;
end;
Pero resulta que cuando quiero enviar a la inversa, es decir Server-Cliente, me surge un problema y es que cuando hago "WriteBuf", este bloque se envia inmediatamente y no espera a tener todo el fichero completo en el BUFFER como ocurre entre Cliente-Server. Esto lo se porque he puesto controles en ambos programas cuando reciben y envian y he podido detectar la inmediatez del envio.
En este caso, el codigo para enviar desde el server es el siguiente:
Código Delphi
[-]procedure Enviarfichero ( fichero:string; Sender: TTCPServerClient );
var
Buffer: PByte;
Leidos: Integer;
begin
with TFileStream.Create(fichero,fmOpenRead or fmShareDenyWrite) do
try
GetMem(Buffer,BufferSize);
try
Leidos:= Read(Buffer^,BufferSize);
while (Leidos > 0) do
begin
Sender.Stream.Writer.WriteBuffer(Buffer^,Leidos);
Leidos:= Read(Buffer^,BufferSize);
end;
finally
FreeMem(Buffer);
end;
finally
Free;
end;
end;
En todo caso lo que intento es lograr parar el envio del "WriteBuf" hasta no acabar de escribir todo el fichero.
Existe alguna manera de abrir y cerrar la comunicacion (sin cerrar la conexion entre ambos), es decir, como un grifo que pueda abrir y cerar segun me interese.?, seguro que en esto esta la clave.
No se si me he podido explicar correctamente, espero que alguien me pueda dar una luz al respecto.
Gracias