Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 16-04-2007
JMGR JMGR is offline
Miembro
 
Registrado: jun 2003
Ubicación: Santa Cruz de Tenerife
Posts: 46
Poder: 0
JMGR Va por buen camino
Gracias por la respuesta poliburro pero es que ya tengo muy avanzada la aplicacion como pa meterme ahora a investigar p2p...

De todas maneras ya lo consegui y voy a explicar mis conclusiones por si a alguien le hace falta:

1- Efectivamente, hay que rellenar el Stream en la llamada al evento OnRead correspondiente al envio, es decir, el cliente envia una palabra clave para indicar que a continuacion se va a enviar un stream:
Código Delphi [-]
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   socket.SendText('TOMASTREAM');//<--Mandamos la palabra clave
   socket.SendStream(stream);//<--Y a continuacion mandamos el stream
end;

El servidor recibe la palabra clave y se dispara el evento OnRead, la palabra clave le indica que la proxima vez que se dispare OnRead va a recibir el stream, recibiendo la cantidad transferida en Socket.ReceiveBuf pero, y he aqui lo importante, SOLO EN LA PROXIMA LLAMADA A OnRead, es decir, si se dispara otra vez OnRead y se vuelve a llamar a Socket.ReceiveBuf ya no contendra la informacion...¿ como solucionarlo? Pues mi solucion ha sido controlar con un contador si se ha recibido la palabra clave en cuyo caso la siguiente vez que se dispare OnRead espero a rellenar el stream...no se si quedo claro pero igual el codigo ayuda:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
 vez:=0;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 nReceived:integer;
 Buffer: array [0..99999] of char;
 Stream:TMemoryStream;
begin
[...] 
//IMPORTANTE Lo primero que hacemos en el evento OnRead es controlar si hemos recibido la palabra clave
//Esta es la parte que se encarga del stream
if vez=1 then//<--Controlamos si en la llamada anterior hemos recibido la palabra clave
  begin
    vez:=0;//<--Reiniciamos el contador y creamos el stream
    Stream := TMemoryStream.Create;
    Screen.Cursor := crHourglass;
      try
        while True do
        begin
          nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer));//<--Controla la cantidad de datos recibida
          if nReceived <= 0 then//<--Si ya no se reciben datos, es decir, al terminar la transferencia
            Break
          else
            Stream.Write (Buffer, nReceived);//<--Vamos rellenando el stream
          Sleep (200);
        end;
        Stream.Position := 0;
        stream.SaveToFile(directorio+nombre);
      finally
      end;
    Stream.Free;
    Screen.Cursor := crDefault;
    exit;
  end;

if (pos('TOMASTREAM',strcom)=1) and (vez<2) then //<--Al recibir la palabra clave aumentamos el contador
  begin
    vez:=vez+1;
    exit;
  end;
end;

end;

Evidentemente se podria usar un boolean para controlar la recepcion de la palabra clave pero acabo de conseguir que funcione y no lo he optimizado todavia...
Un detalle importante es que en el evento OnRead debemos controlar si se va a recibir el stream antes de acceder a la informacion del Socket, es decir, antes de llamar a socket.receivetext o socket.receivebuf, para rellenarlo

Espero que se haya entendido algo...

Un saludo!
JMGR
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
velocidad de transferencia muy lenta lookmydoom Redes 1 26-08-2006 18:34:49
Transferencia lenta entre HDD ATA y HDD SATA Sergio J. Varios 1 22-04-2005 17:30:16
Velocidad de transferencia... eisenco Internet 0 21-03-2005 08:58:05
Transferencia FTP no se finaliza DarkByte Internet 0 05-03-2005 10:39:35
Transferencia de archivos Silver Varios 2 13-06-2003 23:12:38


La franja horaria es GMT +2. Ahora son las 06:35:14.


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
Copyright 1996-2007 Club Delphi