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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-05-2007
victork_py victork_py is offline
Miembro
 
Registrado: may 2003
Posts: 54
Poder: 21
victork_py Va por buen camino
Enviar y recibir archivos con TCPCliente y TCPServer

Hola a todos, estoy programando una aplicación que debe enviar y recibir archivos con otra PC conectada en la misma red.

Estoy programando con Turbo Delphi Explorer, y en esa ya no estan los componentes ServerSocket y ClientSocket, a cambio de eso estan TCPServer y TCPClient.

Buscando en google, encuentro ejemplos con ServerSocket y ClientSocket, pero los de TCPServer y TCPClient encuentro muy pocos, y la mayoria son ejemplos de chat.

Para el envío de archivo uso el método SendStream del TCPClient, y supongo que de alguna manera puedo recibirlo con el TCPServer, pero no encuentro la forma de recibirlo, pues no hay un método para recibir un stream.

Podrían darme una pista de como hacer para recibir el archivo con TCPServer?
Responder Con Cita
  #2  
Antiguo 01-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Una posible solución es enviar el archivo y luego desconectar, de esta forma solo tendríamos que leer, en el lado del servidor, hasta que la conexión se cierre.

Por ejemplo:
Código Delphi [-]
const
  BufferSize = 32 * 1024;

// En el evento OnAccept del TTCPServer (BlockMode = bmThreadBlocking)
procedure TfrmMain.ServidorAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  Buffer: PByte;
  Recibidos: Integer;
begin
  // La primera linea que recibimos es la ruta donde guardar el archivo
  with TFileStream.Create(ClientSocket.Receiveln, fmCreate) do
  try
    // Reservamos memoria para el buffer
    GetMem(Buffer,BufferSize);
    try
      // Recibimos los datos del archivo hasta que se cierre la conexion
      Recibidos:= ClientSocket.ReceiveBuf(Buffer^,BufferSize);
      while Recibidos > 0 do
      begin
        // Guardamos los datos recibidos en el archivo
        WriteBuffer(Buffer^,Recibidos);    
        Recibidos:= ClientSocket.ReceiveBuf(Buffer^,BufferSize);
      end;
    finally
      // Liberamos la memoria
      FreeMem(Buffer);
    end;
  finally
    Free;
  end;
end;
El cliente lo implemento dentro de un thread, ya que voy a colocar la propiedad BlockMode = bmBlocking y no quiero que se me bloquee el resto de la aplicación. Aunque puede parecer complicado, esto nos permitirá mandar varios archivos a la vez y también cancelar el envió antes de que termine.

El thread cliente, que yo llamare TEnvio, lo implemento asi:
Código Delphi [-]
// Debajo de interface, junto a la definicion del formualrio
 TEnvio = class(TThread)
  private
    FCliente: TTCPClient;
    FLocalFile: String;
    FRemoteFile: String;
  protected
    procedure Execute; override;
  public
    constructor Create(LocalFile,RemoteFile,Host,Port: String);
    destructor Destroy; override;
  end;


// Debajo de implementation
{ TEnvio }

constructor TEnvio.Create(LocalFile,RemoteFile,Host,Port: String);
begin
  inherited Create(FALSE);
  // Le indicamos que se destruya al termianr
  FreeOnTerminate:= TRUE;
  FLocalFile:= LocalFile;
  FRemoteFile:= RemoteFile;
  // Creamos un TTCPClient
  FCliente:= TTCPClient.Create(nil);
  FCliente.RemoteHost:= Host;
  FCliente.RemotePort:= Port;  
  FCliente.BlockMode:= bmBlocking;
end;

destructor TEnvio.Destroy;
begin
  // Destruimos el TTCPClient
  FCliente.Free;
  inherited;
end;

procedure TEnvio.Execute;
var
  Buffer: PByte;
  Leidos: Integer;
begin
  inherited;
  // Abrimos el archivo como solo lectura
  with TFileStream.Create(FLocalFile,fmOpenRead or fmShareDenyWrite) do
  try
    // Reservamos memoria para el buffer
    GetMem(Buffer,BufferSize);
    try
      // Intentamos conectar con el servidor
      FCliente.Active:= TRUE;
      try
        // Enviamos la ruta donde se debe guardar el archivo
        FCliente.Sendln(FRemoteFile);
        // En este bucle enviamos el archivo
        Leidos:= Read(Buffer^,BufferSize);
        while (Leidos > 0) and not Terminated do
        begin
          FCliente.SendBuf(Buffer^,Leidos);
          Leidos:= Read(Buffer^,BufferSize);
        end;
      finally
        // Cerramos la conexion
        FCliente.Active:= FALSE;
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    Free;
  end;
end;

Un ejemplo de como usar lo anterior:
Código Delphi [-]
var
  Envio: TEnvio;
begin
  with TOpenDialog.Create(nil) do
  try
    if Execute then
    begin
      Envio:= TEnvio.Create(Filename, 'C:\' +  ExtractFileName(Filename),
        txtHost.Text, '2000');
    end;
  finally
    Free;
  end;
end;
En cualquier momento podemos cancelar la transmisión utilizando "Envio.Terminate". Pero te dejo a ti escoger cuando y donde utilizar esa opción. Otras mejoras pueden ser que la ruta del archivo remoto sea relativa y no absoluta, por motivos de seguridad, o enviar junto con el archivo su hash md5 para comprobar que ha llegado bien. Pero eso lo podemos dejar para mas adelante ...

Aquí te dejo el proyecto envuelto para regalo ...
Archivos Adjuntos
Tipo de Archivo: zip Ejemplo40.zip (5,6 KB, 192 visitas)
Responder Con Cita
  #3  
Antiguo 07-07-2015
charley charley is offline
Registrado
NULL
 
Registrado: jun 2015
Posts: 1
Poder: 0
charley Va por buen camino
Enviar y recibir archivos con TCPCliente y TCPServer

amigos no logro enviar mas de un archivo tanto con ese codigo como con otro que tengo, estoy desesperado, ayuda por favorrrrrrrrrrrrrr!!!!!
Responder Con Cita
  #4  
Antiguo 07-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
charley,

¡Bienvenido al Club Delphi!

Te sugiero revisar la Guía de estilo de los foros, recomendada a todos los nuevos ingresos al Club Delphi.

¡Gracias por tu cooperación!

Nelson.
Responder Con Cita
  #5  
Antiguo 16-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por charley Ver Mensaje
necesito poder mandar varios de un tiro, lo he intentado de varias formas y nada...soy un novatón.
Saludos y gracias de antemano
Por favor, lee la guía de estilo de clubdelphi, que te ha recomendado el compañero. Gracias por tu colaboración.
Responder Con Cita
Respuesta



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
enviar y recibir capturar rs232 pipecato Varios 3 17-10-2005 22:17:45
Enviar/Recibir por Pt. paralelo en Delphi 7 desve Varios 0 29-09-2005 08:14:59
Enviar y Recibir Archivos (Codigo para hacerlo) juliopag1 Internet 0 17-05-2005 21:22:44
Porque deja de recibir mensajes el Demo TcpServer de Delphi???? AGAG4 Varios 0 13-12-2004 17:14:56
¿Cómo puedo enviar y recibir archivos vía IRC con el componente TIdIRC? DarkByte Internet 4 26-06-2004 17:54:05


La franja horaria es GMT +2. Ahora son las 14:22:11.


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