Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Controlar Read/Write con TCP's (https://www.clubdelphi.com/foros/showthread.php?t=62642)

JPMMVR 06-01-2009 15:43:13

Controlar Read/Write con TCP's
 
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


La franja horaria es GMT +2. Ahora son las 23:27:22.

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