Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Poder: 0
Status Quo Va por buen camino
Smile Más consultas sobre el tema

jejeje...delphi al poder!!!

He utilizado lo de los record (que buena idea! ) y normalmente me va bien sobre todo en los ficheros jpg pequeños...
Los word los estropea...no se. Vamos que a veces me va bien y a veces mal...Esta tarde cuando llegue a mi casa añado el código.

Yo creeo que envíar, los envía bien...el problema creo que es al recibirlos porque a lo mejor no llegan completos, no sé...

Yo cuando he utilizado socket para mandar texto lo iba encolando en un string, si la variable cola(de tipo string) era mayor que 2(tamaño del campo de tamaño de mensaje) cojía el tamaño (lo pasaba a entero). Luego comparaba el tamaño de la cola de mensajes con el campo de tamaño y si era mayor o igual extraía el mensaje y lo borraba de la cola... y de esta manera aseguraba que los mensajes llegaran completos
Bueno eso hacía e iba muy bien.
No se si será necesario encolar los bytes...(no tengo ni idea de como encolar, recoger en mi estructura y eliminar bytes de una cola de bytes pero bueno...)

Bueno esta tarde os lo cuento mejor con código incluido a ver que os parece...
Responder Con Cita
  #2  
Antiguo 26-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
No tengo mucha experiencia con los componentes que usas (TClientSocket y TServerSocket, corrigeme si me equivoco), ni si quiera lo tengo en la paleta de componentes Pero he estado haciendo unas pruebas y parece que no funciona mal del todo:

Código Delphi [-]
unit ufrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    Cliente: TClientSocket;
    Servidor: TServerSocket;
    Destino: TFileStream;
    procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  Paquete = record
    Tipo: Integer;
    Tamano: Integer;
    Buffer: array[0..1024] of Byte;
  end;

Const
  Normal = 0;
  Comienzo = 1;
  
procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  P: Paquete;
begin
  Socket.ReceiveBuf(P, Sizeof(P));
  if P.Tipo = Comienzo then
  begin
    FreeAndNil(Destino);
    Destino:= TFileStream.Create('d:\2.jpg', fmCreate);
  end;
  Destino.WriteBuffer(P.Buffer,P.Tamano);
  if P.Tamano < Sizeof(P.Buffer) then
  begin
    FreeAndNil(Destino);
    ShowMessage('Recibido');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Cliente:= TClientSocket.Create(Self);
  Servidor:= TServerSocket.Create(Self);
  Cliente.ClientType:= ctBlocking;
  Servidor.ServerType:= stNonBlocking;
  Servidor.OnClientRead:= OnClientRead;
  Servidor.Port:= 3000;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Servidor.Active:= TRUE;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  P: Paquete;
begin
  Cliente.Active:= FALSE;
  Cliente.Port:= 3000;
  Cliente.Host:= '127.0.0.1';
  Cliente.Active:= TRUE;
  with TFileStream.Create('d:\1.jpg', fmOpenRead) do
  try
    P.Tipo:= Comienzo;
    repeat
      Application.ProcessMessages;
      P.Tamano:= Read(P.Buffer,Sizeof(P.Buffer));
      Cliente.Socket.SendBuf(P,sizeof(P));
      P.Tipo:= Normal;
    until P.Tamano < Sizeof(P.Buffer);
  finally
    Free;
  end;
end;

end.

He utilizado el tipo NonBlocking aunque no me gusta este tipo de sockets, mas que nada porque me resultaba mas sencillo, ¿que tipo usas tu? Me gustaria echarle un vistazo a tu codigo.
Responder Con Cita
  #3  
Antiguo 26-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Poder: 0
Status Quo Va por buen camino
Llevo toda la tarde sin internet

Gracias Seoane , ahora te paso mi código...Perdona, me he tenido que ir a casa de mi primo...me he cambiado de proveedor de internet...y me han tenido sin internet hasta ahora ... Voy a preparar el código para ponerlo...Si lo quieres todo dime dónde lo subo o dónde te lo mando...
Gracias por la ayuda de verdad...Este año tengo unos compañeros bastante pasotas y no estoy recibiendo ninguna ayuda por parte de ellos...todo lo contrario...es competencia pura...
Responder Con Cita
  #4  
Antiguo 26-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Poder: 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
  #5  
Antiguo 26-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Código Delphi [-]
ClientSocket2.Socket.SendBuf(P,sizeof(P)-1);

A simple vista me parece que en esta linea te sobra el "-1". El resto parece que esta bien, pero habria que mirarlo mas profundamente.
Responder Con Cita
  #6  
Antiguo 26-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Poder: 0
Status Quo Va por buen camino
Gracias!

Ahora estoy poniéndolo en un solol socket y haciendo que recorra un directorio y mande todos los ficheros que hay en el.

Miraré lo que me has dicho. Cuando complete todo te lo enseño.

Gracias!!
Responder Con Cita
  #7  
Antiguo 27-05-2006
Status Quo Status Quo is offline
Miembro
 
Registrado: may 2006
Posts: 23
Poder: 0
Status Quo Va por buen camino
Red face no puedo extraer el nombre del fichero

He puesto un solo socket para envíar los paquetes y he puesto el record así:


type
Paquete = record
Tipo: Integer;
Tamano: Integer;
TamaTotal:Integer;
NomFich:String;
Buffer: array[0..1024] of Byte;
end;


No se si habrá algún problema con los strings pero el caso esque no me llega el nombre en el código de recepción...

Pongo todo el código con el que estoy trabajando para hacer las pruebas(luego lo pasaré al que estoy haciendo yo...)

No se lo que son los tipos NonBlocking yo utilizo de la paleta de componentes--> internet el componente clientsockect y serversocket...

Seoane, te pongo el código este de pruebas...Cuando lo terminte(por favor que sea pronto) te paso el programa total...(como tu me digas que te viene mejor...)


Este es el código que envía el fichero:


Código Delphi [-]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
Paquete = record
Tipo: Integer;
Tamano: Integer;
TamaTotal:Integer;
NomFich:String;
Buffer: array[0..1024] of Byte;
end;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
OpenDialog1: TOpenDialog;
ServerSocket1: TServerSocket;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket2Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
Streamsize: TFileStream;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Open;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Connected to ' +Socket.RemoteHost); // Shows the address of the server you connect to
end;

procedure TForm1.ClientSocket2Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Sending File ' +Edit1.Text +' .........')
end;

procedure TForm1.Button2Click(Sender: TObject);
var
stream:TStream;


P: Paquete;

begin
if ServerSocket1.Active = True then

begin
OpenDialog1.Filter := 'All Files (*.*)'; // you can add more choices by adding | and followed by description and (*.extension)
OpenDialog1.FilterIndex := 1; // Here you follow which index number from above you want
if OpenDialog1.Execute then
begin
Edit1.Text := ExtractFileName(OpenDialog1.FileName); // To send as filename after

Streamsize := TFileStream.Create(OpenDialog1.FileName, fmopenread); // Stream created just to Calculate size
Edit2.Text := inttostr(Streamsize.Size);

Streamsize.Position := 0;
Streamsize.Free;
sleep(2000);


stream:=TFileStream.Create(OpenDialog1.FileName, fmopenRead);

P.Tipo:= 0;
repeat
Application.ProcessMessages;
P.Tamano:= stream.Read(P.Buffer,SizeOf(P.Buffer));
P.NomFich:=Edit1.Text;
P.TamaTotal:=Streamsize.Size;
ServerSocket1.Socket.Connections[0].SendBuf(P,sizeof(P));  //he quitado el -1
//leidos:=stream.Read(P.Buffer,SizeOf(P.Buffer));
P.Tipo:= 1;
until(P.Tamano=0);
stream.Free;

end;
end
else
MessageDlg('Error: You are not connected', mtError, [MbOK],0); // Error Check above code won't work until the socket is connected
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text := '';
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var IncommingText, StrippedData, CommandName: string;
begin
IncommingText := socket.ReceiveText; // Put all incoming data into this string
StrippedData := copy(IncommingText,6,length(IncommingText) ); // letters 6 to end is the actual data being sent
CommandName := copy(IncommingText,0,5); // letters 0 to 5 is the fixed letter space for the command name
if CommandName = 'DONE!' then // Expected command Done! note : This is case sensitive so match has to be the same case
begin
Memo1.Lines.Add('File ' +Edit1.Text +' ' +Edit2.Text +' was Recieved Successfully');

Edit1.Text := '';
Edit2.Text :='';
end;
end;

end.

Perdonar, no se porqué se me ha ido toda la indentación...

Última edición por Status Quo fecha: 28-05-2006 a las 16:49:16.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Recorrer arreglo Perrero80 Varios 3 18-05-2006 22:52:27
Compatibilidad entre PChar y String vick Conexión con bases de datos 5 24-10-2005 21:50:35
¿como pasar de String dentro de un PChar? Moises22 Varios 6 27-09-2005 15:43:47
Pchar y String superhopi Varios 8 19-08-2004 09:54:06
problemas de compatibilidad de tipos pchar y string VRO Varios 2 13-05-2004 10:29:34


La franja horaria es GMT +2. Ahora son las 01:17:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi